首页 > 代码库 > 文件上传-不过滤+MIME

文件上传-不过滤+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="http://www.mamicode.com/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="http://www.mamicode.com/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