upload-labs闖關
1關
- 原理:客戶端(前端js驗證文件是否正確)驗證,可以直接抓包,重放繞過。
2關
- 原理
mime:多用途互聯網郵件擴展類型。是設定某種擴展名的文件用一種應用程序來打開的方式類型(規定了擴展名)
-
可以用第一關的方式繞過
-
原理:其content-type(mime)是由客戶端根據你上傳的文件生成的,但限制只能是jpg/image格式,所以抓包改就好了
也可以抓一個正確的包,修改器白名單限制類型
改mime為image/jpeg
3關
黑名單過濾,禁止上傳.asp|.aspx|.php|.jsp后綴文件。更改后綴解析
例:AddType application/x-httpd-php .php .php3 .phtml
apche服務配置以上語句 將.php .php3 .phtml都以php格式解析,所以思路就是修改可以解析的后綴。
需要自己修改apche配置文件httpd.conf,構造漏洞環境)
AddType application/x-httpd-php .php .php3 .phtml
但是我是phpstudy新版,無法解析文件環境問題
4關
查看源碼,發現過濾了幾乎所有的后綴名,還是黑名單。
htaccess文件:是Apache服務器中的一個配置文件,它負責相關目錄下的網頁配置。通過htaccess文件,可以幫我們實現:網頁301重定向、自定義404錯誤頁面、改變文件擴展名、允許/阻止特定的用戶或者目錄的訪問、禁止目錄列表、配置默認文檔等功能。
原理:他沒有過濾 .htaccess后綴,我們可以構建一個htaccess配置文件,讓所有格式文件都解析為php,然后再上傳圖片馬(只要后綴是允許的,隨便都可以)就會被解析了。
.htaccess語句:
SetHandler application/x-httpd-php
-
上傳.htaccess文件
-
上傳圖片馬(千萬不要用phpstudy的新版本,解析不了,只能用老版本,我在新版本哪里浪費了很多時間)
5關
還是先看源碼,發現還是黑名單過濾,這次包括了.htaccess后綴,但是第四關源碼全部轉化為了小寫,第五關沒有過濾大小寫。所以可以通過大小寫繞過。
1-直接將木馬后綴改為1.Php就好了
6關
首先查看源代碼,發現也是黑名單過濾。只是沒有收尾去空。所以可以更改后綴,在末尾加入空格。windows后綴會刪除末尾的.和空格。所以bp抓包,將文件改為1.php .(空格加點),傳進去后會刪除空格和.保留1.php文件名。(因為bp不能末尾加空格無用,所以換成空格加.)
1-后綴改為1.php .
7關
黑名單,沒有對后綴名進行去"."處理,在bp中改為1.php. ,傳成功后就會自動刪除“.”
8關
查看源代碼,黑名單過濾,沒有對后綴名進行去”::$DATA”處理,利用windows特性,可在后綴名中加” ::$DATA”繞過:
NTFS文件系統包括對備用數據流的支持。這不是眾所周知的功能,主要包括提供與Macintosh文件系統中的文件的兼容性。備用數據流允許文件包含多個數據流。每個文件至少有一個數據流。在Windows中,此默認數據流稱為:$ DATA。
1-bp中文件后綴改為:1.php::$DATA
9關
查看文件源代碼,還是黑名單過濾,先刪除文件名末尾的點,再進行首尾去空。都只進行一次。故可以構造點空格點進行繞過。
1-后綴名為:1.php. .
10關
原理:利用str_ireplace對黑名單里的文件后綴名進行了替換,換成空字符,使用了str_ireplace函數,即不區分大小寫,故大小寫繞過不適用。但是這里替換是替換成了空字符。
順序雙寫,我們就可以構建.pphphp后綴。從左至右識別到php替換后,還剩下一個php。(不能.phpphp這樣全部都能識別替換)
11關
查看源代碼,發現使用了白名單,只允許jpg,png,gif三種格式文件。
if(isset($_POST['submit'])){
$ext_arr = array('jpg','png','gif');
$file_ext = substr($_FILES['upload_file']['name'],strrpos($_FILES['upload_file']['name'],".")+1);
if(in_array($file_ext,$ext_arr)){
$temp_file = $_FILES['upload_file']['tmp_name'];
$img_path = $_GET['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;
if(move_uploaded_file($temp_file,$img_path)){
$is_upload = true;
} else {
$msg = '上傳出錯!';
}
}
理解原理:$_GET['save_path']函數是文件最終存儲路徑。代碼里面拼接了一些隨機字符,我們可以上傳1.jpg,而在 save_path這個最終保存路徑函數下面保存為1.php並加上%00來隔斷后面的隨機字符,這樣實際存儲到服務器上面路徑上就是1.php的后綴了。
這里利用的是00截斷。即move_uploaded_file函數的底層實現類似於C語言,遇到0x00會截斷
截斷條件:
1、php版本小於5.3.4
2、php.ini的magic_quotes_gpc為OFF狀態
-
將1.php改為1.jpg后綴(白名單限制),抓包?save_path=../upload/1.php%00
-
加入截斷%00
-
返回url時間戳,復制地址,粘貼測試,../upload/1.php /3120200428231832.jpg
12關
原理:和11關一樣,但11關是$_GET['save_path'],12關是$_POST['save_path']。請求方式不同。還是用截斷的方法繞過,我試了一下%00發現不成功。
原理:通過get方式在url中添加%00,通過get方式傳遞到服務器會被自動解碼,所以ASCII碼數值0對應的(null)字符,達到截斷的目的。
遇到ascii碼為零的位置就停止,而這個ascii碼為零的位置在16進制中是00
通過post,加入%00不會被服務器解碼,只會原樣被參數變量接受。所以這里要修改post數據的16進制來達到截斷的目的。(0x00是十六進制表示方法,是ascii碼為0的字符,在有些函數處理時,會把這個字符當做結束符。)就是說系統是按16進制讀取文件(或者說二進制)。
1-可以通過bp直接url手動解碼
../upload/1.php%00,選擇%00右擊選擇convert selection(轉換)-> url->url decode(url解碼)
2-也可以在hex里面修改1.php后面的一個字符的16進制改為00,來對應asscall碼的0字符達到截斷的作用。
具體參照:https://www.zhaosimeng.cn/writeup/68.html
17關
原理:時間差,競爭關系。
上傳木馬文件會在緩存中停留幾毫秒然后才被刪除掉,可以利用這個時間差執行操作。
1-首先抓取上傳木馬的數據包
木馬構造語句,在解析執行時,創建一個新的shell2.php木馬文件,內容為一句話木馬。只要訪問成功就可以在這個時間差內,寫入一個新文件,即使這個文件之后被刪除也沒有關系。
’);?>2-抓取訪問包
通過不停的訪問,來在這個時間差內抓取到還未刪除的木馬文件,使其解析執行。
3-在爆破模塊,先執行訪問包,在執行木馬包。這樣能更大概率的能成功執行木馬文件。pload配置如下
每個包都不斷發送2000次,這樣總會抓住時間差,解析木馬成功。