代码改变世界

谈谈前段时间Xiaonei的XSS漏洞,及从中的一些想法

2008-08-25 19:18  JimLiu  阅读(2240)  评论(12编辑  收藏  举报

不知道发在首页是否合适?如果不合适请告知,本人撤掉。

上个月无聊玩校内涂鸦板的时候发现有漏洞,当时没公开,Mail给校内,若干天没理,一直就这么拖到了校内网改版,漏洞修复了。

校内涂鸦板一直就是漏洞的源泉,最早支持任意HTML代码,为Hacker大开方便之门,后来只能用CSS了,就麻烦多了,要用诸如expr/**/ession:...这样的手段,再往后CSS几乎无法攻破了(至少我没发现,别人发现的也都被一一解决)。

但是“背景图片” 一项还是有漏洞,被我无意间发现了。

背景图片里过滤非常差,可以构建任意HTML代码。

介绍

P.S.由于漏洞已修复,所以只能凭借我的记忆来写,难免有错,请各位看官见谅!

填入背景图片后会发现生成的网页源代码大概是这样

background:url(这里是填写的内容)...后面是选项,诸如对其,滚动什么的决定。

那就容易了,可以

填写这样的代码

);</style><script src="....."></script><style>body{background:url(

简单地构造成

background:url();</style><script src="....."></script><style>body{background:url()...后面还是那些选项

试试?发现通不过,必须是http://开头。倒!那还不容易?

background:url(http://);</style><script src="....."></script><style>body{background:url()...后面还是那些选项

这样就没问题了,测试一下,引用的文件里的脚本能正确执行

以下是测试的效果


没错——就是这么简单,不需要高深的对XSS的理解,只用像搭积木一样把它发挥出来就可以了。

后果

其实这不用我多说,熟悉Script Injection的朋友应该都知道了,这样的脚本在执行的时候和当前页面是在同一个域下的。也就是说在通过这段脚本发起异步请求的时候,是带着Cookie发送的。谁的Cookie?当然是正在浏览这个页面的人啦!也就是说,如果我在我自己的页面上构造恶意代码,别人访问这个页面的时候我可以不知不觉地以他的身份对服务器异步请求,比如给我留言,分享我的文章等。如果能解决涂鸦板的验证码的话,更可以修改它的涂鸦板,用同样的手法,构成一个JavaScript的蠕虫。

当然,对于这个漏洞的具体应用我没有作更多的尝试,而只是简单地在别人访问我的页面时,异步请求对方自己的主页,解析出对方的名字,再window.alert出来,告诉浏览者这个漏洞的存在——主要是由于校内用了很多不同的域名头,跨域Ajax很麻烦,我没有作过多的尝试。

反思

俗话说“枪打出头鸟”,涂鸦板的自定义CSS由于其前身漏洞过多,经过多次修修补补(校内曾因为脚本注入造成过具有一定规模的JavaScript蠕虫),现在的安全性已经有了较大提高,可也没有想到竟然在这个背景图片上栽了跟斗。

虽然现在漏洞已经修复,我在这里说什么也多少有点马后炮的嫌疑了,但是我还是想提一下Xiaonei的工作效率——7月19号我发现这个漏洞的当天就发了邮件给他们,一直没有收到回复,我就觉得没回复也就算了,可是漏洞一直没有被修复。我也因此一直没有公开这个漏洞的存在。后来发现校内正在试运行新版界面,再后来全面改版了,漏洞随之而不再存在,虽然是一个解决,但是我还是不认同这样的做法——虽然是即将放弃的产品,但是绝对不能因为这一二十天的时间就无视这样一个具有较高危险性的漏洞的存在,我觉得这应该是软件人一个起码的素质追求吧?

另一方面,我们很多时候都着眼于一些看起来高深莫测的、复杂的、大家都关注的技术点,认为那是最容易出问题的地方。也许那的确是最容易出问题的地方,但是由于我们的关注,发现了问题,解决了问题。而同时我们却很容易忽略一些看起来无关紧要的小细节,而我的确不得不搬出那句很老甚至有点土的话:“细节决定成败”。

还好,现在漏洞已经修复了……