upload通关手册
upload-labs通關(guān)
0x00 前言
這段時(shí)間一直在忙,沒(méi)時(shí)間來(lái)更新文章,這里就寫篇upload-labs的通關(guān)手冊(cè)吧,現(xiàn)在包括網(wǎng)上也有很多upload通關(guān)手冊(cè),但是在這里還是想自己去寫一篇,來(lái)做個(gè)自我總結(jié)。在做靶場(chǎng)當(dāng)中也參考了網(wǎng)上的文章。
0x01 pass-01-10
第一關(guān)
來(lái)到第一關(guān)卡,選擇,把burp開(kāi)啟抓包。點(diǎn)擊上傳會(huì)發(fā)現(xiàn),直接就彈框不允許上傳了。
那么基本可以判斷這是個(gè)前端校驗(yàn)的。此時(shí)有三種辦法,
(1)、審查元素刪除過(guò)濾函數(shù)
(2)、直接禁用js
(3)、先上傳jpg文件然后抓包重命名
這里就直接來(lái)禁用js文件繞過(guò)。
上傳成功。
第二關(guān)
查看源代碼
$_FILES["file"]["name"] - 上傳文件的名稱
$_FILES["file"]["type"] - 上傳文件的類型
$_FILES["file"]["size"] - 上傳文件的大小,以字節(jié)計(jì)
$_FILES["file"]["tmp_name"] - 存儲(chǔ)在服務(wù)器的文件的臨時(shí)副本的名稱
$_FILES["file"]["error"] - 由文件上傳導(dǎo)致的錯(cuò)誤代碼
這里獲取了上傳文件的類型,如果類型等于image/jpeg、image/png、image/gif就可以上傳成功。
可以直接修改mime類型來(lái)繞過(guò)。
burp抓包,修改content-type的類型為image/gif
成功繞過(guò)。
第三關(guān)
file_exists() 函數(shù)檢查文件或目錄是否存在。
trim() :函數(shù)移除字符串兩側(cè)的空白字符或其他預(yù)定義字符。
deldot():移除末尾的點(diǎn)
strrchr() 函數(shù)查找字符在指定字符串中從后面開(kāi)始的第一次出現(xiàn)的位置,如果成功,則返回從該位置到字符串結(jié)尾的所有字符,如果失敗,則返回 false。與之相對(duì)應(yīng)的是strstr()函數(shù),它查找字符串中首次出現(xiàn)指定字符的位置
strtolower:轉(zhuǎn)化為小寫
這里定義了一個(gè)數(shù)組,黑名單的數(shù)組,并且去除了末尾的點(diǎn)和空格、::$data等字符,且匹配了后綴名。
這里還可以使用到一些過(guò)濾不全去繞過(guò),上傳php3或者是phtml一樣能被當(dāng)做php來(lái)識(shí)別,當(dāng)然這個(gè)得看apache的解析設(shè)置。
抓包改名為php3,點(diǎn)擊forword
上傳成功,成功被識(shí)別。
第四關(guān)
由于后面的關(guān)卡和前面的代碼大致一樣就不一一解釋了。
第四關(guān)卡把能禁用的都給禁用掉了,但是唯獨(dú)沒(méi)有禁用掉.htaccess 文件我們可以上傳.htaccess文件,然后再去上傳圖片馬。
.htacess 內(nèi)容如下:
SetHandler application/x-httpd-php
成功繞過(guò)上傳限制。
第五關(guān)
這里比上一關(guān)少了一個(gè)轉(zhuǎn)換成小寫,我們就可以利用到大小寫去對(duì)他進(jìn)行繞過(guò)。
windwos對(duì)大小寫不敏感,無(wú)論大小寫都能識(shí)別,而linux則相反。
上傳成功,下一關(guān)
第六關(guān)
這一關(guān)和前面的都差不多,去除了點(diǎn)號(hào)和::$data 但是缺少去除空格的函數(shù)。
我們可以加個(gè)空格來(lái)繞過(guò)他的限制,在windows里面后綴的空格會(huì)自動(dòng)過(guò)濾掉。
這里后綴后面加了個(gè)空格,成功繞過(guò)
第七關(guān)
這里沒(méi)有去除后綴后面的點(diǎn),我們可以利用到windows 后綴加點(diǎn)號(hào)自動(dòng)過(guò)濾掉的這個(gè)特性來(lái)繞過(guò)限制。
成功繞過(guò)。
第八關(guān)
代碼里面去除了點(diǎn)號(hào)空格,但是這關(guān)確漏掉了::$data,我們就可以利用到windwos文件流特性去繞過(guò)文件上傳限制。利用的是NTFS文件系統(tǒng)的一個(gè)特性,NTFS存儲(chǔ)數(shù)據(jù)流的一個(gè)屬性,當(dāng)我們這樣去訪問(wèn)的時(shí)候,其實(shí)我們請(qǐng)求的,它就會(huì)被認(rèn)為是phpinfo.php本身的數(shù)據(jù)
上傳完成后,去除::$data 直接訪問(wèn)xx.php文件解析成功
第九關(guān)
第九關(guān)這個(gè)地方去除去除了大部分的東西,前面用到的點(diǎn)號(hào)和空格都被過(guò)濾了,但是這里還是有辦法繞過(guò)去,我們可以多加幾個(gè)空格和點(diǎn) ,代碼里面的只過(guò)濾一次。
添加完成后發(fā)包過(guò)去就可以看到上傳成功。
訪問(wèn),解析成功。
第十關(guān)
在第十關(guān)代碼和前面的不大一樣,我們來(lái)審計(jì)一下代碼
這里定義了一個(gè)array數(shù)組,黑名單的數(shù)組,如果匹配到接收過(guò)來(lái)的后綴等于定義數(shù)組里面的內(nèi)容就替換為空。
代碼如下:
$file_name = str_ireplace($deny_ext,"", $file_name);
str_ireplace 是個(gè)替換的函數(shù)
我們嘗試直接上傳個(gè)phpinfo 。
這里能直接上傳成功,但是后綴被替換為空了,因?yàn)檫@些代碼都是只過(guò)濾一次,我們可以使用到雙寫來(lái)繞過(guò)。
第十一關(guān)
這里的代碼寫的是白名單,只允許上傳jpg等圖片格式的文件,在我們前面用到的黑名單都不能使用了。
但是我們還可以利用到00截?cái)鄟?lái)對(duì)他進(jìn)行繞過(guò)。
在url中%00表示ascll碼中的0 ,而ascii中0作為特殊字符保留,表示字符串結(jié)束,所以當(dāng)url中出現(xiàn)%00時(shí)就會(huì)認(rèn)為讀取已結(jié)束。
使用burp抓包后,發(fā)現(xiàn)他的目錄是可控的,我們可以直接從目錄那里對(duì)他進(jìn)行截?cái)?/p>
發(fā)送 訪問(wèn)
這里會(huì)訪問(wèn)失敗,把php后面的東西去掉,再次訪問(wèn)。
第十二關(guān)
第十二關(guān)也是一樣的白名單,先來(lái)抓個(gè)包看看
這里發(fā)現(xiàn)和前面不一樣的地方,就是剛剛的路徑是在url里面的,而這一個(gè)關(guān)卡的是在post包里面。
那么需要00截?cái)嘈枰獯a,因?yàn)樵趗rl里面?zhèn)鲄?huì)自動(dòng)解碼而post里面不會(huì)。
發(fā)送
第十三關(guān)
這里的代碼定義個(gè)函數(shù)打開(kāi)我們上傳的文件并且讀取我們的前面2位數(shù)。
這時(shí)候我們改文件后綴是沒(méi)用的,一樣上傳不了,可以直接加上gif89a或者是直接制作圖片馬。
copy 1.jpg/b+phpinfo.php/a 3.jpg
制作完成,直接上傳,然后還需要配合文件包含來(lái)解析。
圖片馬上傳成功,打開(kāi)解析漏洞的頁(yè)面包含這張圖片。
成功執(zhí)行。第十四關(guān)也是一樣的可以上傳成功,都是判斷了圖片的完整性
第十五關(guān)
這里使用的
exif_imagetype() 讀取一個(gè)圖像的第一個(gè)字節(jié)并檢查其簽名。
定義有以下常量,并代表了 exif_imagetype() 可能的返回值:
1 IMAGETYPE_GIF
2 IMAGETYPE_JPEG
3 IMAGETYPE_PNG
上傳圖片馬,配合文件包含漏洞,成功解析
這幾關(guān)里面,唯一不同的就是驗(yàn)證圖片的方式和函數(shù)不一樣。
第十六關(guān)
這里的驗(yàn)證比前面的多了不是,獲取了名字和mime類型,
然后進(jìn)行校驗(yàn),驗(yàn)證完成后才進(jìn)行二次渲染
第十六關(guān),使用了gd庫(kù)對(duì)圖片做了二次渲染。
那么我們先來(lái)上傳一個(gè)普通的圖片馬看看。
上傳完成后使用包含,報(bào)錯(cuò)了。
我們來(lái)下載這張圖片然后對(duì)他進(jìn)行查看。
用010editot打開(kāi)發(fā)現(xiàn)我們后面加上的phpinfo();已經(jīng)被刷掉了。
那么我們可以使用16進(jìn)制對(duì)比工具來(lái)看 原圖和渲染后的圖,哪個(gè)地方?jīng)]用被gd給處理過(guò),從gd庫(kù)沒(méi)處理的地方插入paylaod。
顯示藍(lán)色的是未被gd庫(kù)未被渲染的地方
關(guān)于二次渲染可以參考先知論壇大佬的文章,很詳細(xì)。
https://xz.aliyun.com/t/2657
第十七關(guān)
move_uploaded_file() 函數(shù)將上傳的文件移動(dòng)到新位置。
若成功,則返回 true,否則返回 false。
rename() 函數(shù)重命名文件或目錄。
這里先是把文件用move_uploaded_file()函數(shù)移動(dòng)到了上傳的目錄下面,如果不是白名單,再使用unlink函數(shù)將文件刪除。
那么我們可以上傳寫入木馬的代碼
<?php fputs(fopen("shell.php", "w"), '<?php @eval($_POST["shell"]) ?>'); ?>
截取上傳數(shù)據(jù)包,發(fā)送到intrude模塊,持續(xù)發(fā)送,另外開(kāi)一個(gè)持續(xù)訪問(wèn)上傳的目錄。
等到響應(yīng)200 的時(shí)候木馬就寫入成功了。
然后瀏覽器訪問(wèn)shell.php
訪問(wèn)成功,這時(shí)候就可以拿一句話去連接了
這里的條件競(jìng)爭(zhēng)條件是文件未被重命名。
0x02 結(jié)尾
這里就把大致的方法都總結(jié)了一遍,當(dāng)然還確實(shí)了一些各種的解析漏洞和文件包含的東西,都會(huì)配合到文件上傳漏洞來(lái)使用,在一些cms爆出后臺(tái)getshell漏洞時(shí)候也可以getshell ,比如配置插馬,備份數(shù)據(jù)庫(kù)拿shelll 。
總結(jié)
以上是生活随笔為你收集整理的upload通关手册的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: chipmunk 物理引擎的基本概念和基
- 下一篇: 历年人民币存款利率表