首页 > 代码库 > 文件上传-不过滤+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