Pikachu靶场-Unsafe Fileupload
字数 1106 2025-08-24 20:49:22
不安全的文件上传漏洞教学文档
1. 不安全的文件上传漏洞概述
文件上传功能在Web应用系统中非常常见,例如头像上传、附件上传等。当用户上传文件时,后台通常会对文件进行以下判断:
- 文件类型
- 文件后缀名
- 文件大小
- 然后按照设计的格式进行重命名并存储在指定目录
漏洞风险:如果后台对上传文件没有进行足够严格的安全判断,攻击者可能上传恶意文件(如一句话木马),导致服务器被植入Webshell。
安全设计建议:
- 验证文件类型、后缀名、大小
- 验证文件的上传方式
- 对文件进行复杂重命名
- 不要暴露文件上传后的路径
2. 客户端检查绕过 (Client Check)
漏洞分析
前端JavaScript代码检查文件扩展名:
function checkFileExt(filename) {
var flag = false;
var arr = ["jpg","png","gif"]; // 允许的扩展名
var index = filename.lastIndexOf(".");
var ext = filename.substr(index+1);
for(var i=0;i<arr.length;i++) {
if(ext == arr[i]) {
flag = true;
break;
}
}
if(!flag) {
alert("上传的文件不符合要求,请重新选择!");
location.reload(true);
}
}
绕过方法
-
禁用JavaScript:
- 在火狐或Chrome浏览器中禁用JavaScript
- 上传PHP文件时,前端验证将被绕过
-
直接构造请求:
- 使用Burp Suite等工具直接发送上传请求,绕过前端验证
利用结果
上传成功后访问路径:
http://x.x.x.x/vul/unsafeupload/uploads/phpinfo.php
3. MIME类型检查绕过
漏洞分析
服务器检查上传文件的MIME类型:
- 常见图片MIME类型:
- GIF图形: image/gif
- JPEG图形: image/jpeg
- PNG图形: image/png
绕过方法
-
上传PHP文件时,抓包修改Content-Type为图片类型:
Content-Type: image/jpeg -
上传步骤:
- 选择PHP文件上传
- 拦截请求
- 修改Content-Type头
- 放行请求
4. getimagesize检查绕过
漏洞分析
PHP的getimagesize()函数检查文件头是否为有效的图像格式。
绕过方法
方法一:添加图片文件头
-
在PHP文件开头添加图片标识:
- 对于GIF:
GIF89 - 对于JPEG:
ÿØÿà - 对于PNG:
‰PNG
- 对于GIF:
-
示例:
GIF89 <?php phpinfo(); ?> -
保存为.jpg扩展名后上传
方法二:图片后附加PHP代码
-
使用命令行合并图片和PHP代码:
copy 1.png/b + phpinfo.php/a 2.png/b表示二进制文件/a表示ASCII文件
-
上传合并后的文件
利用方法
由于服务器将文件识别为图片,需要配合文件包含漏洞执行PHP代码:
http://x.x.x.x/vul/fileinclude/fi_local.php?filename=../../unsafeupload/uploads/2020/10/20/5936185f8e5245666f2586884965.jpg&submit=提交查询
5. 防御措施
有效的防御策略
-
服务器端验证:
- 文件扩展名白名单
- 文件内容验证
- MIME类型验证
-
文件处理:
- 重命名上传文件(避免使用用户提供的文件名)
- 设置适当的文件权限
- 存储在非Web可访问目录
-
其他措施:
- 限制上传文件大小
- 使用病毒扫描
- 禁用上传文件的执行权限
PHP示例代码
$allowed = ['jpg', 'png', 'gif'];
$ext = pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION);
if (!in_array($ext, $allowed)) {
die('不允许的文件类型');
}
if (!getimagesize($_FILES['file']['tmp_name'])) {
die('文件不是有效的图片');
}
$new_name = md5(uniqid()) . '.' . $ext;
move_uploaded_file($_FILES['file']['tmp_name'], '/safe/directory/' . $new_name);
总结
不安全的文件上传漏洞危害严重,防御需要多层验证:
- 前端验证(用户体验,不可靠)
- 服务器端扩展名验证
- 文件内容验证
- 安全的文件存储和处理
通过全面防御措施,可以有效防止恶意文件上传攻击。