檔案上傳 upload-labs Pass 11-1
阿新 • • 發佈:2022-04-08
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
檔案,導致可繞過檔案上傳的上傳、包含等檢測