文件上傳漏洞 upload-labs

文件上傳漏洞是指由于程序員在對用戶文件上傳部分的控制不足或者處理缺陷,而導(dǎo)致的用戶可以越過其本身權(quán)限向服務(wù)器上上傳可執(zhí)行的動態(tài)腳本文件。這里上傳的文件可以是木馬,病毒,惡意腳本或者WebShell等,文件上傳漏洞本身就是一個危害巨大的漏洞,WebShell更是將這種漏洞的利用無限擴(kuò)大。

一、upload-labs

upload-labs是一個使用php語言編寫的,專門收集滲透測試和CTF中遇到的各種上傳突破的靶場。逐步幫助大家對上傳入侵有一個全面的了解。目前一共20關(guān),每個關(guān)都包含著不同上傳方式。 GitHub地址:https://github.com/c0ny1/upload-labs

?靶機(jī)包含防御類型分類

二、開始通關(guān)

Pass-01? JS檢查

1.先新建一個PHP文件寫入一句話木馬,命名為test.php,直接上傳

2.提示無法上傳該文件類型,查看一下前端源碼,可以看到是JS限制


我們可以通過修改前端源碼、禁用瀏覽器JS、使用burpsuite改包這三種方式來繞過攔截,這里以burpsuite抓包為例

3.先將test.php改成test.php.jpg,通過burpsuite抓包之后放到重放模塊,然后改包test.php.jpg改成test.php,然后放行,通過右邊看到頁面顯示正常

4.文件上傳成功,使用菜刀連接一句話木馬,連接成功

Pass-02???只驗(yàn)證Content-typ

1.嘗試使用第一關(guān)方法,直接上傳test.php.jpg進(jìn)行抓包改包,嘿...一樣可以

2.題目說是文件類型攔截,直接上傳php文件可以得到提示,那么我們刪除test02.php重新操作一下

3.通過burpsuite抓包,修改Content-Type為image/jpeg(簡單來說就是修改為它可放行的文件類型),然后放行數(shù)據(jù)包,同樣上傳成功

Pass-03? ?黑名單繞過

1.直接上傳test03.php,黑名單不允許上傳.asp,.aspx,.php,.jsp后綴的文件
但可以上傳.phtml .phps .php5 .pht

前提是apache的httpd.conf中有如下配置代碼

AddType application/x-httpd-php .php .phtml .phps .php5 .pht

2.通過burpsuite抓包,將test03.php改為test03.php5,放行數(shù)據(jù)包,返回包中可以看到文件上傳解析的路徑

菜刀連接成功

Pass-04?? .htaccess繞過

1.直接上傳test04.php5,發(fā)現(xiàn)有黑名單限制,并且根據(jù)提示黑名單列表龐大

拒絕了幾乎所有有問題的后綴名,除了.htaccess,所以我們可以編寫.htaccess文件,作用:將待會上傳的04.jpg解析為04.php(這次寫一個phpinfo文件命名為04.jpg)

上傳成功

2.訪問http://127.0.0.1/upload-labs/upload/test04.jpg,解析成功

Pass-05? ?后綴大小寫繞過

1.這一關(guān)主要是沒有對后綴名的大小寫進(jìn)行過濾,所以我們嘗試抓包命名為test05.phP進(jìn)行繞過

2.訪問http://127.0.0.1/upload-labs/upload/202104011727386865.phP

訪問正常

Pass-06? ?空格繞過

嘗試上傳,發(fā)現(xiàn)大小寫繞過失敗,說明程序?qū)缶Y進(jìn)行了大小寫處理,改包將test06.php改成test06.php空格

上傳成功

Pass-07? ?點(diǎn)繞過

原理與Pass-06相同,在文件名后面加一個點(diǎn)

上傳成功

Pass-08? ?::$DATA文件流特性繞

1.這關(guān)將所有可解析的后綴名進(jìn)行了過濾

2.Windows文件流特性繞過,文件名改成test08.php::$DATA,上傳成功后保存的文件名其實(shí)是test08.php

上傳成功

Pass-09? ?點(diǎn)+空格+點(diǎn)繞過

原理同Pass-06,上傳文件名后加上點(diǎn)+空格+點(diǎn),改為test09.php. .

上傳成功

Pass-10??雙寫繞過

黑名單過濾,將黑名單里的后綴名替換為空且只替換一次,因此可以用雙寫繞過

Pass-11??文件路徑%00截斷

1.$img_path是直接拼接,因此可以利用%00截斷繞過,截斷條件:php版本小于5.3.4,php的magic_quotes_gpc為OFF狀態(tài)

2.先上傳test11.jpg,然后修改路徑進(jìn)行截斷,注意一定要符合上面條件

?php的magic_quotes_gpc為OFF狀態(tài)

上傳成功

Pass-12 ?00截斷

1.本關(guān)卡與Pass-11原理相同,但不同的是ave_path參數(shù)通過POST方式傳遞,還是利用00截斷,因?yàn)镻OST不會像GET對%00進(jìn)行自動解碼,所以需要在二進(jìn)制中進(jìn)行修改

在test12.php后面改成00進(jìn)行截斷

上傳成功

Pass-13? ?上傳圖片馬

1.我們需要一張圖片13.jpg和一句話木馬(這里我的是info文件)寫好的php文件test13.php,在電腦本地將13.jpg和test13.php放到同一目錄下

然后在該目錄下用cmd執(zhí)行命令:copy 13.jpg/b + test13.php/a test13.jpg

新生成的test13.jpg就是我們制作好的圖片馬

直接上傳圖片馬

2.直接訪問圖片并不能把圖片當(dāng)做PHP解析,因此還需要利用文件包含漏洞,根據(jù)頁面提示include.php腳本在127.0.0.1/upload-labs/目錄下,構(gòu)造鏈接

127.0.0.1/upload-labs/include.php?file=upload/5020210402141517.jpg

訪問成功

3.png格式圖片上傳方法與jpg相同

4.GIF格式可以通過添加GIF圖片的文件頭GIF89a,繞過GIF圖片檢查

Pass-14 ??上傳圖片馬? getimagesize()檢查

本關(guān)操作與上一關(guān)Pass-13完全相同

Pass-15? ?上傳圖片馬? exif_imagetype()檢查

本關(guān)操作與上一關(guān)Pass-13完全相同

Pass-16? ?二次渲染繞過

原理:將一個正常顯示的圖片,上傳到服務(wù)器。尋找圖片被渲染后與原始圖片部分對比仍然相同的數(shù)據(jù)塊部分,將Webshell代碼插在該部分,然后上傳。

制作方法參考鏈接:

https://blog.csdn.net/weixin_45519736/article/details/105775721

Pass-17? ?條件競爭

通過源碼可以看到文件先經(jīng)過保存,然后判斷后綴名是否在白名單中,如果不在則刪除,此時可以利用條件競爭在保存文件后刪除文件前來執(zhí)行php文件,可以利用burpsuite的intruder模塊不斷上傳,然后我們不斷的訪問刷新該地址即可

1.先準(zhǔn)備后門文件test17.php,用Python寫一個腳本來請求文件test17.php,打開burpsuite用來重放文件test17.php

2.運(yùn)行py腳本,同時開始burpsuite上傳

上傳成功

可以訪問

Pass-18? ?條件競爭

本關(guān)也存在條件競爭的問題,不過這題對文件后綴名做了白名單判斷,利用上傳重命名競爭+Apache解析漏洞進(jìn)行繞過,test18.php.7z的文件內(nèi)容與上一關(guān)相同(生成一個新的文件shell2.php)

2.運(yùn)行py腳本同時開始上傳test18.php.7z

可能是作者大佬忘了給上傳的路徑加"/",所以導(dǎo)致上傳的文件改名后都是uploadxxxxx.7z,只需在myupload.php文件中對應(yīng)地方添加斜杠就行

3.等到python出現(xiàn)OK,停止上傳,并訪問shell2.php文件

訪問成功

Pass-19? ?文件名0x00截斷

move_uploaded_file()函數(shù)中的img_path是由post參數(shù)save_name控制的,因此可以在save_name利用00截斷繞過,方法同pass-12

Pass-20??數(shù)組 + /.繞過

通過查看源碼可以發(fā)現(xiàn): $file_name經(jīng)過reset($file) . '.' . $file[count($file) - 1];處理 如果上傳的是數(shù)組的話,會跳過$file = explode('.', strtolower($file)); 并且后綴有白名單過濾:
$ext = end($file);$allow_suffix = array('jpg','png','gif');
而最終的文件名后綴取的是$file[count($file) - 1],因此我們可以讓$file為數(shù)組 $file[0]為smi1e.php/,也就是reset($file),然后再令$file[2]為白名單中的jpg 此時end($file)等于jpg,$file[count($file) - 1]為空 而?$file_name = reset($file) . '.' . $file[count($file) - 1];,也就是smi1e.php/.,最終move_uploaded_file會忽略掉/.,最終上傳smi1e.php

【END】

到此為止,文件上傳漏洞通關(guān)就算完成了,試想一下:如果沒有源碼?又能通幾關(guān)?

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容