一、upload-labs
upload-labs是一個(gè)使用php語言編寫的肌索,專門收集滲透測試和CTF中遇到的各種上傳突破的靶場。逐步幫助大家對(duì)上傳入侵有一個(gè)全面的了解特碳。目前一共20關(guān)诚亚,每個(gè)關(guān)都包含著不同上傳方式。 GitHub地址:https://github.com/c0ny1/upload-labs二午乓、開始通關(guān)
Pass-01? JS檢查
1.先新建一個(gè)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文件误证,作用:將待會(huì)上傳的04.jpg解析為04.php(這次寫一個(gè)phpinfo文件命名為04.jpg)
上傳成功
2.訪問http://127.0.0.1/upload-labs/upload/test04.jpg,解析成功
Pass-05? ?后綴大小寫繞過
1.這一關(guān)主要是沒有對(duì)后綴名的大小寫進(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相同蓝谨,在文件名后面加一個(gè)點(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截?cái)?/strong>
1.$img_path是直接拼接,因此可以利用%00截?cái)嗬@過娃肿,截?cái)鄺l件:php版本小于5.3.4咕缎,php的magic_quotes_gpc為OFF狀態(tài)
2.先上傳test11.jpg,然后修改路徑進(jìn)行截?cái)嗔先牛⒁庖欢ㄒ仙厦鏃l件
?php的magic_quotes_gpc為OFF狀態(tài)
上傳成功
Pass-12 ?00截?cái)?/strong>
1.本關(guān)卡與Pass-11原理相同凭豪,但不同的是ave_path參數(shù)通過POST方式傳遞,還是利用00截?cái)嗉欠#驗(yàn)镻OST不會(huì)像GET對(duì)%00進(jìn)行自動(dòng)解碼墅诡,所以需要在二進(jìn)制中進(jìn)行修改
在test12.php后面改成00進(jìn)行截?cái)?/span>
上傳成功
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? ?二次渲染繞過
原理:將一個(gè)正常顯示的圖片然磷,上傳到服務(wù)器。尋找圖片被渲染后與原始圖片部分對(duì)比仍然相同的數(shù)據(jù)塊部分刊驴,將Webshell代碼插在該部分姿搜,然后上傳。
制作方法參考鏈接:
https://blog.csdn.net/weixin_45519736/article/details/105775721
Pass-17? ?條件競爭
通過源碼可以看到文件先經(jīng)過保存捆憎,然后判斷后綴名是否在白名單中舅柜,如果不在則刪除,此時(shí)可以利用條件競爭在保存文件后刪除文件前來執(zhí)行php文件躲惰,可以利用burpsuite的intruder模塊不斷上傳致份,然后我們不斷的訪問刷新該地址即可
1.先準(zhǔn)備后門文件test17.php,用Python寫一個(gè)腳本來請(qǐng)求文件test17.php础拨,打開burpsuite用來重放文件test17.php
2.運(yùn)行py腳本氮块,同時(shí)開始burpsuite上傳
上傳成功
可以訪問
Pass-18? ?條件競爭
本關(guān)也存在條件競爭的問題绍载,不過這題對(duì)文件后綴名做了白名單判斷,利用上傳重命名競爭+Apache解析漏洞進(jìn)行繞過滔蝉,test18.php.7z的文件內(nèi)容與上一關(guān)相同(生成一個(gè)新的文件shell2.php)
2.運(yùn)行py腳本同時(shí)開始上傳test18.php.7z
可能是作者大佬忘了給上傳的路徑加"/"击儡,所以導(dǎo)致上傳的文件改名后都是uploadxxxxx.7z,只需在myupload.php文件中對(duì)應(yīng)地方添加斜杠就行
3.等到python出現(xiàn)OK蝠引,停止上傳阳谍,并訪問shell2.php文件
訪問成功
Pass-19? ?文件名0x00截?cái)?/strong>
move_uploaded_file()函數(shù)中的img_path是由post參數(shù)save_name控制的,因此可以在save_name利用00截?cái)嗬@過螃概,方法同pass-12
通過查看源碼可以發(fā)現(xiàn): $file_name經(jīng)過reset($file) . '.' . $file[count($file) - 1];處理 如果上傳的是數(shù)組的話边坤,會(huì)跳過$file = explode('.', strtolower($file)); 并且后綴有白名單過濾:Pass-20??數(shù)組 + /.繞過
而最終的文件名后綴取的是$file[count($file) - 1],因此我們可以讓$file為數(shù)組 $file[0]為smi1e.php/谅年,也就是reset($file),然后再令$file[2]為白名單中的jpg 此時(shí)end($file)等于jpg肮韧,$file[count($file) - 1]為空 而?$file_name = reset($file) . '.' . $file[count($file) - 1];融蹂,也就是smi1e.php/.,最終move_uploaded_file會(huì)忽略掉/.弄企,最終上傳smi1e.php$ext = end($file);
$allow_suffix = array('jpg','png','gif');
【END】
到此為止超燃,文件上傳漏洞通關(guān)就算完成了,試想一下:如果沒有源碼拘领?又能通幾關(guān)意乓?