文件上传-不过滤+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呢?(代码片段