文件上传漏洞靶机Writeup
字数 1411 2025-08-18 11:39:04
文件上传漏洞全面解析与防御指南
一、文件上传漏洞概述
文件上传漏洞是Web应用程序中常见的高危漏洞,攻击者通过上传恶意文件获取服务器控制权。本文详细分析多种文件上传绕过技术及防御措施。
二、实验环境准备
- 操作系统:Windows 10
- 服务器环境:WAMP (Windows + Apache + MySQL + PHP)
- 必备工具:
- Burp Suite抓包工具
- 一句话木马文件
- 文本编辑器
三、文件上传绕过技术详解
1. 前端JS验证绕过
漏洞原理:仅依赖前端JavaScript验证文件扩展名,未在服务端进行二次验证。
利用方法:
- 审查网页源代码,查找允许的扩展名列表(如
.jpg|.png|.gif) - 创建PHP木马文件,保存为允许的扩展名(如shell.jpg)
- 使用Burp Suite拦截上传请求
- 修改文件扩展名为.php后放行
<?php eval($_GET['cmdback']);?>
2. MIME类型验证绕过
漏洞原理:服务端仅检查Content-Type头信息。
利用方法:
- 拦截上传请求
- 修改Content-Type为允许的类型(如
image/gif) - 放行数据包
3. 黑名单验证绕过
漏洞原理:使用不完善的黑名单过滤特定扩展名。
绕过技巧:
- 使用非常见PHP扩展名:
.php4,.php5,.phtml - 大小写变异:
.PhP,.pHp - 特殊字符:
.php.,.php_,.php(空格) - Windows特性:
.php::$DATA
4. .htaccess文件解析控制
利用方法:
- 上传.htaccess文件内容:
<FilesMatch ".jpg">
SetHandler application/x-httpd-php
</FilesMatch>
- 上传图片木马(使用copy命令合并):
copy 1.jpg/b + 1.php 2.jpg
5. %00截断技术
条件:PHP版本<5.3.4,magic_quotes_gpc关闭
GET请求利用:
- 上传路径参数:
../upload/1.php%00 - 实际上传文件名:2.jpg
- 最终保存为:2.php
POST请求利用:
- 使用Hex编辑器修改为
../upload/1.php[二进制00]
6. 双写扩展名绕过
漏洞原理:仅进行一次替换过滤
示例:
- 原始文件名:shell.pphphp
- 过滤后:shell.php
7. 文件头检查绕过
方法:
- 在真实图片文件头部插入恶意代码
- 确保文件头符合要求(如GIF89a)
- 配合解析漏洞或截断技术使用
四、防御措施
1. 文件扩展名处理
- 使用白名单而非黑名单
- 统一转换为小写:
$file_ext = strtolower($file_ext) - 彻底去除特殊字符:
$file_ext = str_ireplace('::$DATA', '', $file_ext)
2. 文件内容验证
- 检查真实文件类型(使用
finfo_file()) - 验证图片文件完整性(尺寸、像素等)
- 重写文件内容(如使用GD库重新生成图片)
3. 上传目录安全
- 设置上传目录不可执行
- 单独配置上传目录解析规则
- 随机化上传文件名和路径
4. 服务器配置
- 禁用危险解析规则
- 及时更新Web服务器软件
- 限制上传文件大小
5. 其他措施
- 对上传文件进行病毒扫描
- 记录所有上传操作日志
- 返回信息加密处理
五、总结
文件上传漏洞主要源于:
- 未对用户上传内容进行严格过滤
- Web服务器解析漏洞配合
安全开发应遵循"不信任任何用户输入"原则,实施多层防御策略,从客户端到服务端建立完整的安全校验机制。