Pikachu靶场-Unsafe Fileupload
字数 898 2025-08-11 21:26:33
不安全的文件上传漏洞教学文档
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浏览器禁用JS后可直接上传PHP文件
- 访问上传路径:
http://x.x.x.x/vul/unsafeupload/uploads/phpinfo.php
3. MIME类型验证绕过
漏洞分析
服务器通过检查Content-Type头验证文件类型:
- 图片文件:
image/jpeg,image/png等 - PHP文件:
text/php或application/x-php
绕过方法
- 上传PHP文件时拦截请求
- 修改
Content-Type为image/jpeg - 放行请求
4. getimagesize验证绕过
服务器使用getimagesize()函数验证文件头是否为有效图像。
绕过方法一:添加图像文件头
- 创建包含PHP代码的文本文件:
<?php phpinfo();?> - 添加图像文件头(如GIF89)
- 修改扩展名为.jpg
- 上传并抓包,确保文件头存在
绕过方法二:图片马制作
- 使用命令将图片与PHP脚本合并:
copy 1.png/b + phpinfo.php/a 2.png - 上传生成的图片马
利用文件包含漏洞执行
即使上传成功,服务器默认将文件作为图片解析。需配合文件包含漏洞执行:
http://x.x.x.x/vul/fileinclude/fi_local.php?filename=../../unsafeupload/uploads/2020/10/20/5936185f8e5245666f2586884965.jpg&submit=提交查询
防御措施
- 文件内容检查:使用文件头验证真实文件类型
- 重命名策略:使用随机字符串重命名上传文件
- 权限控制:上传目录禁止脚本执行
- 隔离存储:将上传文件存储在非Web目录
- 多层验证:结合前端+后端验证
- 文件类型白名单:严格限制允许的文件类型
- 日志监控:记录所有上传行为
实验环境搭建建议
- 使用Pikachu靶场练习
- 配置不同验证级别的上传页面:
- 仅前端验证
- MIME类型验证
- getimagesize验证
- 准备各种绕过工具:
- 浏览器开发者工具
- Burp Suite等抓包工具
- 十六进制编辑器