文章目录
一、实验目的:
1、通过本次实验掌握
MIME检测
的原理。
2、通过upload-labs-master
闯关游戏,掌握MIME检测绕过
技术。
二、工具:
BurpSuite
火狐/谷歌浏览器
三、实验环境:
靶 机: windows10虚拟机
upload-labs-master
闯关游戏
DVWA(Medium级别)
闯关游戏
Pikachu-MIMETYPE
闯关游戏
phpstudy2018
搭建网站
攻击机: 物理机
四、漏洞说明:
1. 什么是MIME:
MIME(Multipurpose Internet Mail Extensions)
多用途互联网邮件扩展类型。是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。
绕过上传限制-服务端绕过MIME检测:
2. 常见的MIME类型:
text/plain
(纯文本)
text/html
(HTML文档)
text/javascript
(js代码)
application/xhtml+xml
(XHTML文档)
image/gif
(GIF图像)
image/jpeg
(JPEG图像)
image/png
(PNG图像)
video/mpeg
(MPEG动画)
application/octet-stream
(二进制数据)
application/pdf
(PDF文档)
3. 检测方式:
在文件上传过程中,服务端会针对我们的上传的文件生成一个数组,这个数组其中有一项就是这个文件的类型
file_type
;服务端对文件进行检测时,就是通过检测脚本中的黑白名单和这个数组中的file_type
进行对比,如果符合要求就允许上传这个文件。
4. MIME绕过的原理:
部分Web应用系统判定文件类型是通过
content-type字段
,黑客可以通过抓包,将content-type字段
改为常见的图片类型
,如image/gif
,从而绕过校验。
五、实验过程:
1. upload-labs闯关游戏(Pass-02):
页面源码:
$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
if (file_exists(UPLOAD_PATH)) {
if (($_FILES['upload_file']['type'] == 'image/jpeg') || ($_FILES['upload_file']['type'] == 'image/png') || ($_FILES['upload_file']['type'] == 'image/gif')) { // 这里通过文件上传时数组中的file_type值来进行MIME类型判断,如果MIME类型存在的话,执行一步操作;
$temp_file = $_FILES['upload_file']['tmp_name']; //如果MIME类型存在的话,获取临时文件的位置;
$img_path = UPLOAD_PATH . '/' . $_FILES['upload_file']['name'] //构造文件转存路径及文件名;
if (move_uploaded_file($temp_file, $img_path)) { //对这个临时文件进行转存;
$is_upload = true;
} else {
$msg = '上传出错!';
}
} else {
$msg = '文件类型不正确,请重新上传!';
}
} else {
$msg = UPLOAD_PATH.'文件夹不存在,请手工创建!';
}
}
检测过程:判断文件是否存在-->存在的话就对文件的MIME-TYPE进行检测-->MIME-TYPE检测通过后,对文件进行转存。
通过上面的源码我们可以看到,源码对我们上传的MIME-TYPE类型
进行检测,我们可以通过burpsuite
抓包修改为符合上面验证的MIME-TYPE类型
进行绕过。
1、创建一个1.php的文件:
内容:
<?php phpinfo();?>
2、上传1.php文件,发现文件上传失败:
3、浏览器开启代理,通过burpsuite
抓包,我们发现,浏览器对我们上传的文件MIME-TYPE类型
进行了标记,上传到服务器和检测脚本源码中的白名单进行对比,没有找到符合条件的所以会上传失败:
4、下面我们在burpsuite
里面,对content-type字段
进行修改,修改为符合的条件,发包并关闭数据拦截功能:
5、回到浏览器,关闭浏览器的代理,右击复制图片链接:
6、访问复制的链接,发现可以进行解析:
2. DVWA(medium级别)
:
1、安全级别设置为Medium级别
:
2、打开burpsuite流量拦截功能:
3、选择1.php文件,开启浏览器代理功能,并上传文件:
4、修改文件的MIME类型
,发包, 关闭流量拦截功能:
5、关闭浏览器的代理,并复制URL进行访问:
6、访问页面,可以解析为脚本文件:
3. Pikachu-MIMETYPE
:
1、进入Pikachu-MIMETYPE
:
2、打开burpsuite流量拦截功能:
3、选择1.php文件,开启浏览器代理功能,并上传文件:
4、修改文件的MIME类型
,发包, 关闭流量拦截功能:
5、关闭浏览器的代理,并复制URL进行访问:
6、访问页面,可以解析为脚本文件: