upload-labs(11~12)通關筆記
環境準備
1、php版本 < 5.3.4
2、magic_quotes_gpc = Off
php我用的是upload-labs官方推薦的5.2.17,搭建平臺用的是phpStudy2018。
修改magic_quotes_gpc
magic_quotes_gpc的作用是對get請求、post請求、cookie...傳入的資料進行轉義處理,它只存在於php5.3.4版本及以下版本,比如當我們傳入url編碼%00
時,%00
就會被轉義成0
,也就是說當magic_quotes_gpc為On的狀態下,url編碼是不會被解析的,而我們又恰恰需要url編碼被解析,所以我們得把magic_quotes_gpc的狀態改為Off。
到php的根目錄找到php.ini檔案, 接著開啟並修改為Off
第11關
過關步驟
檢視前端原始碼
F12直接定位到form表單處,我發現post請求裡面攜帶了一個url引數,疑似是檔案的上傳路徑
廢話少說,咱先測試一下,隨便輸入個引數進去,看看能不能提交成功,如果提交成功則說明這個引數是可控的,即<檔案上傳路徑可控>,反之,就是不可控。
可以看到,剛剛的圖片檔案已經上傳成功了,如圖
檢視後端原始碼
什麼是%00截斷?
在url中%00
表示ascii
碼中的0
,而0
作為特殊字元保留,表示字元結束,也就是說,在儲存檔案的時候,如果路徑引數(例: $img_path
)中出現了%00
,就會認為路徑到這裡就已經結束了,從而忽略後面一系列的引數,比如$img_path = ../upload/test.php%00/test.jpg
%00
給截斷,從而變成$img_path = ../upload/test.php
使用%00截斷有兩個要求:
1、php的版本 < 5.3.4
2、php.ini中的magic_quotes_gpc的狀態為Off
補充:在儲存檔案的時候,如果路徑結尾的檔名稱和實際要儲存的檔名稱重名了的話,那麼則會以路徑結尾的檔名稱為準。
例:../upload/test.php # 儲存路徑
test.jpg # 檔名
實際儲存以後的檔名:test.php
抓包攔截
檢視結果
可以看到,圖片已經上傳成功了
第12關
通關方法和第11關差不多,只不過傳遞save_path引數的方式變成了POST,接收引數的方式也變成了POST
後端接收引數的方式變為了POST
這裡提一點,因為第12關傳遞引數的方式為POST,POST是不會自動解碼的,所以我們需要手動decode一下。
檢視結果