漏洞概要 关注数(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标签: 无
漏洞详情
披露状态:
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 这个文件,其中有以下一段代码:
这段代码里可以看到, 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,以及字符串的拼接。想想就有点小激动哦~~
于是马上写了一个html,调用这个JS文件,并进行了测试,成功执行代码:
6. 这样一来,我们的D思路就是实现了,总结一下,以乌云为例,我们可以构造以下url:
其中 #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):
漏洞证明:
1. 以乌云主站为例:
访问以下URL:http://xsst.sinaapp.com/test/baidutongji.poc.php?baidu.com&url=http://www.wooyun.org/
2. IE下也是可以的,浏览器通用性好。
3. 为了证明其普遍危害,在用户列表里又找了一个用户 汽车之家
修复方案:
1. 对传入的jn参数即sx参数进行有效性判断。
2. 修复 /hm-web/js/heatlink.js中的dom xss问题
版权声明:转载请注明来源 gainover@乌云
漏洞回应
厂商回应:
危害等级:高
漏洞Rank:15
确认时间:2014-10-13 11:33
厂商回复:
感谢提交,我们已经通知业务部门处理此问题。
最新状态:
暂无