文件上傳-不過濾+MIME
寫文件上傳的漏洞代碼的時候,需要對$_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