文件上传-不过滤+MIME

Posted M3tar

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了文件上传-不过滤+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的主要内容,如果未能解决你的问题,请参考以下文章

文件上传漏洞练习 upload-labs(1~5)js过滤,MIME过滤,黑名单过滤,.htaccess文件攻击,.user,ini文件攻击

我的Android进阶之旅关于Android平台获取文件的mime类型:为啥不传小写后缀名就获取不到mimeType?为啥android 4.4系统获取不到webp格式的mimeType呢?(代码片段

我的Android进阶之旅关于Android平台获取文件的mime类型:为啥不传小写后缀名就获取不到mimeType?为啥android 4.4系统获取不到webp格式的mimeType呢?(代码片段

上传文件响应慢的处理方法

.NET Web API Blueimp 多文件上传错误“MIME 多部分流意外结束。MIME 多部分消息不完整。”

在原生 Android 文件选择器中按 mime 类型或扩展名过滤