1. 程式人生 > >文件上傳-不過濾+MIME

文件上傳-不過濾+MIME

app sset echo 不能 bre .html 後綴 成功 目錄

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