標籤:text 位元組 尾碼 file 錯誤 客戶 jpeg code content
寫檔案上傳的漏洞代碼的時候,需要對$_FILES數組有一些瞭解: https://wenku.baidu.com/view/10496f95dd88d0d233d46aa6.html
① 這是一個簡單的檔案上傳(寫這個本來是為了熟悉一下語句,然後都寫了,我還是想讓他出場),傳一個php尾碼的看能不能成功,隨便試了一下,成功了,
檢查一下是不是成功了
② :這個是檔案類型過濾的(寫的時候,是只允許image/jpeg通過的)
首先嘗試直接上傳php尾碼的是不行的,經過實驗,發現是MIME驗證,抓包,改一下CONTENT-TYPE ,emmm,就是下面這樣
代碼①:
1 <html> 2 <head> 3 <title>uploadfiletest</title> 4 </head> 5 <meta http-equiv="content-type" content="text/html";charset="utf-8"> 6 <body> 7 <form action="" enctype="multipart/form-data" method="POST" name="uploadfile"> 8 上傳檔案: <input type="file" name="upfile" /> 9 <input type="submit" value="upload" name="submit"> 10 </form> 11 </body> 12 </html> 13 <!-- 完全沒有過濾,任意檔案上傳 --> 14 <?php 15 if (isset($_POST[‘submit‘])) { 16 echo "檔案名稱:".$_FILES[‘upfile‘][‘name‘]."<br />"; 17 echo "檔案大小:".$_FILES[‘upfile‘][‘size‘]."<br />"; 18 echo "檔案類型:".$_FILES[‘upfile‘][‘type‘]."<br />"; 19 echo "臨時路徑:".$_FILES[‘upfile‘][‘tmp_name‘]."<br />"; 20 echo "上傳後系統傳回值:".$_FILES[‘upfile‘][‘error‘]."<br />"; 21 echo "====================儲存分割線========================<br />"; 22 if ($_FILES[‘upfile‘][‘error‘] == 0) { 23 if (!is_dir("./upload")) { 24 mkdir("./upload"); 25 } 26 $dir = "./upload/".$_FILES[‘upfile‘][‘name‘]; 27 move_uploaded_file($_FILES[‘upfile‘][‘tmp_name‘],$dir); 28 echo "檔案儲存路徑:".$dir."<br />"; 29 echo "上傳成功...<br />"; 30 31 } 32 } 33 ?>
代碼②:
1 <html> 2 <head> 3 <title>uploadfile</title> 4 </head> 5 <meta http-equiv="content-type" content="text/html";charset="utf-8"> 6 7 <body> 8 <form action="" enctype="multipart/form-data" method="POST" name="uploadfile"> 9 上傳檔案: <input type="file" name="upfile" /> 10 <input type="submit" value="upload" name="submit"> 11 </form> 12 </body> 13 </html> 14 15 <!-- 按檔案類型過濾 --> 16 <?php 17 if (isset($_POST[‘submit‘])) { 18 19 /* echo "檔案名稱:".$_FILES[‘upfile‘][‘name‘]."<br />"; 20 echo "檔案大小:".$_FILES[‘upfile‘][‘size‘]."<br />"; 21 echo "檔案類型:".$_FILES[‘upfile‘][‘type‘]."<br />"; 22 echo "臨時路徑:".$_FILES[‘upfile‘][‘tmp_name‘]."<br />"; 23 echo "上傳後系統傳回值:".$_FILES[‘upfile‘][‘error‘]."<br />"; 24 echo "===========================================<br />"; */25 $flag = 0; 26 switch ($_FILES[‘upfile‘][‘type‘]) { 27 case ‘image/jpeg‘: 28 $flag = 1; 29 break; 30 default: 31 die("檔案類型錯誤....."); 32 break; 33 } 34 if ($_FILES[‘upfile‘][‘error‘] == 0 && $flag ) { 35 if (!is_dir("./upload")) { //如果檔案名稱存在並且為目錄則返回 TRUE。 36 mkdir("./upload"); 37 } 38 $dir = "./upload/".$_FILES[‘upfile‘][‘name‘]; 39 move_uploaded_file($_FILES[‘upfile‘][‘tmp_name‘],$dir); 40 echo "檔案儲存路徑:".$dir."<br />"; 41 echo "上傳成功...<br />"; 42 } 43 } 44 ?>
心得:
1.表單中 enctype="multipart/form-data " 的意思,是設定表單的 MIME 編碼。預設情況,這個編碼格式是application/x-www-form-urlencoded,不能用於檔案上傳;只有使用了 multipart/form-data ,才能完整的傳遞檔案資料,進行下面的操作
2.$_FILES數組的運用:
$_FILES[‘upFile‘][‘name‘] 用戶端檔案的原名稱
$_FILES[‘upFile‘][‘type‘] 檔案的 MIME類型,需要瀏覽器提供該資訊的支援,例如"image/gif"
$_FILES[‘upFile‘][‘size‘] 已上傳檔案的大小,單位為位元組
$_FILES[‘upFile‘][‘tmp_name‘] 檔案被上傳後在服務端儲存的臨時檔案名稱,一般是系統預設,可以在php.ini的upload_tmp_dir指定,但用 putenv() 函數設定是不起作用的
$_FILES[‘upFile‘][‘error‘] 和該檔案上傳相關的錯誤碼,[‘error‘] 是在 PHP 4.2.0版本中增加的,下面是它的說明:(它們在PHP3.0以後成了常量)
UPLOAD_ERR_OK 值:0; 沒有錯誤發生,檔案上傳成功
UPLOAD_ERR_INI_SIZE 值:1; 上傳的檔案超過了 php.ini 中 upload_max_filesize選項限制的值
UPLOAD_ERR_FORM_SIZE 值:2;上傳檔案的大小超過了 HTML 表單中 MAX_FILE_SIZE 選項指定的值
UPLOAD_ERR_PARTIAL 值:3; 檔案只有部分被上傳
UPLOAD_ERR_NO_FILE 值:4;沒有檔案被上傳, 值:5; 上傳檔案大小為0
檔案上傳-不過濾+MIME