1. 程式人生 > 其它 >檔案上傳 upload-labs Pass 11-1

檔案上傳 upload-labs Pass 11-1

Pass11

審計原始碼

$is_upload = false;
$msg = null;
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)){
      // in_array會判斷上傳檔案字尾名是否在ext_arr陣列中,如果存在,則繼續執行
        $temp_file = $_FILES['upload_file']['tmp_name'];
        $img_path = $_GET['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;
        // 通過GET請求方法獲取 save_path 儲存的目錄,這裡可以使用 php00階段
        if(move_uploaded_file($temp_file,$img_path)){
            $is_upload = true;
        } else {
            $msg = '上傳出錯!';
        }
    } else{
        $msg = "只允許上傳.jpg|.png|.gif型別檔案!";
    }
}

這次的程式碼升級了,和之前的不一樣,這次是白名單,只允許jpg|png|gif字尾檔案
這裡可以通過 $_GET['save_path'] 進行 00截斷 檔案上傳

php00階段

存在於php低於 5.3.4的版本中

攻擊者可以構造類似這樣的語句
$_GET["filename"] ,通過抓包修改 filename=test.php%00.txt
php讀取字尾名會重右往左讀取,讀取到我們的檔案,首先讀取到.txt檔案,遇到了%00認為就結束了,不在往前讀取程式碼就會認為我們上傳的檔案為.txt檔案,導致可繞過檔案上傳的上傳、包含等檢測