文件上传-不过滤+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

时间: 2024-10-30 00:27:10

文件上传-不过滤+MIME的相关文章

SpringMVC返回JSON数据以及文件上传、过滤静态资源

返回JSON数据 在如今前后端分离的趋势下,后端基本不需要再去关心前端页面的事情,只需要把数据处理好并通过相应的接口返回数据给前端即可.在SpringMVC中,我们可以通过@ResponseBody注解来返回JSON数据或者是XML数据. 这个注解的作用是将控制器方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,也就是HTTP响应的内容体,一般我们都是用来返回JSON数据,因为默认是按JSON格式进行转换的. 需要注意的是,在使用此注解之后不会再走视图解

nodejs+multer+ajax文件上传

前端 html代码 + ajax代码 form表单(无需指定action) <form enctype="multipart/form-data" method="post" class="upload-cont"> <input type="file" name="files1" class="files1"> <input type="text

WEB攻击与防御技术 pikachu——文件上传漏洞

文件上传漏洞 一.client check 首先看到标题是客户端验证 用BURP抓包,由于是客户端的检验,直接将抓到的包的文件后缀.png改成.php 发送后发现成功绕过,上传成功 二.MIME type MIME类型还是要借助Burp工具来利用 将content type文件头改成png的文件头 别的都不需要去更改,点击发送就会发现,文件上传成功,MIME绕过成功 三.getimagesize 原文地址:https://www.cnblogs.com/p201721210024/p/12077

WebApi发送HTML表单数据:文件上传与多部分MIME

5.3 Sending HTML Form Data5.3 发送HTML表单数据(2) 本文引自:http://www.cnblogs.com/r01cn/archive/2012/12/20/2826230.html By Mike Wasson|June 21, 2012作者:Mike Wasson | 日期:2012-6-21 Part 2: File Upload and Multipart MIME第2部分:文件上传与多部分MIME This tutorial shows how to

(转)WebApi发送HTML表单数据:文件上传与多部分MIME

5.3 Sending HTML Form Data5.3 发送HTML表单数据(2) 本文引自:http://www.cnblogs.com/r01cn/archive/2012/12/20/2826230.html By Mike Wasson|June 21, 2012作者:Mike Wasson | 日期:2012-6-21 Part 2: File Upload and Multipart MIME第2部分:文件上传与多部分MIME This tutorial shows how to

owasp文件上传漏洞简析

0x01: 文件上传漏洞起因于,上传程序没有对上传文件格式进行正确判断,导致可执行程序上传到网站目录. 常见的验证上传文件有两种:1.js本地验证,通过js获取上传文件后缀名,并和白名单比较,匹配则上传成功.由于js代码是本地验证,存在绕过风险(去除js代码,构造表单数据,直接绕过). 2.后端程序验证,通过post数据到file_upload()函数,$_FILES['file']['type']判断上传程序后缀名. function file_upload(){ $file_name = $

Struts2入门(七)——Struts2的文件上传和下载

一.前言 在之前的随笔之中,我们已经了解Java通过上传组件来实现上传和下载,这次我们来了解Struts2的上传和下载. 注意:文件上传时,我们需要将表单提交方式设置为"POST"方式,并且将enctype属性设置为"multipart/form-data",该属性的默认值为"application/x-www-form-urlencoded",就是说,表单要写成以下这种形式: <form action="" metho

HTML5 增强的文件上传域

在HTML5以前,HTML的文件上传域的功能具有很大的局限性,这种局限性主要体现在如下两点: 每次只能选择一个文件进行上传 客户端代码只能获取被上传文件的文件路径,无法访问实际的文件内容 一.FileList对象和File对象 HTML5为type='file' 的<input/>元素增加了两个属性. accept:该属性控制允许上传的文件类型.该属性为一个或多个MIME类型字符串.多个MIME类型字符串之间应以都好分割. multiple:该属性设置是否允许选择多个文件 JavaScript

深入分析JavaWeb 47 -- Struts2拦截器与文件上传下载

一.struts2中的拦截器(框架功能核心) 1.过滤器VS拦截器 过滤器VS拦截器功能是一回事.过滤器是Servlet规范中的技术,可以对请求和响应进行过滤. 拦截器是Struts2框架中的技术,实现AOP(面向切面)的编程思想,是可插拔的, 可以对访问某个 Action 方法之前或之后实施拦截. 拦截器栈(Interceptor Stack): 将拦截器按一定的顺序联结成一条链. 在访问被拦截的方法时, Struts2拦截器链中的拦截器就会按其之前定义的顺序被依次调用 Struts2执行原理