fewftybet/Upload_Auto_Fuzz
GitHub: fewftybet/Upload_Auto_Fuzz
一款自动化文件上传漏洞Fuzz测试工具,通过智能Payload变异与多种绕过策略帮助发现上传接口的安全缺陷。
Stars: 0 | Forks: 0
# Upload Auto Fuzz
**Upload Auto Fuzz** 是一款文件上传漏洞自动化 Fuzz 测试工具,通过智能生成变异 Payload 对目标上传接口进行批量测试,快速发现绕过姿势。支持 **16 种绕过策略**、**条件竞争模式**、**文件包含链式利用** 和 **多语言 WebShell 生成**。
## 核心特性
- **16 种 Fuzz 策略**:后缀绕过、Content-Disposition 变异、Content-Type 伪造、大小写变换、双扩展名、空字节注入、特殊字符、编码绕过、WAF 绕过、Magic Bytes、Windows/Linux 特性、配置文件上传、WebShell 内容变异、save_name POST 参数绕过、save_path GET 参数绕过
- **多语言支持**:PHP / ASP / ASPX / JSP 全系列 WebShell 生成
- **条件竞争模式**:专为 upload-labs Pass-18 设计,高频并发上传 + 访问,利用文件删除时间窗口
- **文件包含链式利用**:利用靶场全局 `/include.php` 将上传文件作为 PHP 执行,不受扩展名限制
- **智能响应分析**:中英文关键词匹配,自动判定上传成功/失败/重定向/服务器错误
- **模块化架构**:低耦合设计,策略可独立扩展,新增策略仅需实现一个方法
- **代理支持**:配合 Burp Suite 进行详细请求分析
- **试运行模式**:生成 Payload 不发送,提前预览测试内容
## 项目结构
Upload_Auto_Fuzz-main/
├── main.py # 入口程序
├── include_bypass.py # 文件包含链式利用脚本 (Pass-11/18)
├── input/ # 输入文件目录
│ ├── request.txt # 原始 HTTP 请求
│ └── payload.txt # 上传部分模板
├── output/ # 输出目录 (自动创建)
├── upload_fuzz/ # 核心模块包
│ ├── __init__.py
│ ├── core/ # 核心模块
│ │ ├── __init__.py
│ │ ├── logger.py # 日志输出
│ │ ├── config.py # 配置管理
│ │ └── factory.py # Payload 工厂
│ ├── strategies/ # Fuzz 策略模块
│ │ ├── __init__.py
│ │ ├── base.py # 策略基类
│ │ ├── suffix.py # 后缀绕过
│ │ ├── content_disposition.py # Content-Disposition 变异
│ │ ├── content_type.py # Content-Type 伪造
│ │ ├── windows_features.py # Windows 特性
│ │ ├── linux_features.py # Linux 特性
│ │ ├── magic_bytes.py # Magic Bytes
│ │ ├── null_byte.py # 空字节注入
│ │ ├── encoding.py # 编码绕过
│ │ ├── waf_bypass.py # WAF 绕过
│ │ ├── config_files.py # 配置文件上传
│ │ ├── webshell_content.py # WebShell 内容
│ │ ├── special_chars.py # 特殊字符
│ │ ├── case_variation.py # 大小写变换
│ │ ├── double_extension.py # 双扩展名
│ │ ├── save_name.py # save_name POST 参数绕过
│ │ └── save_path.py # save_path GET 参数绕过
│ ├── http/ # HTTP 模块
│ │ ├── __init__.py
│ │ ├── parser.py # 请求解析
│ │ └── sender.py # 请求发送
│ ├── analysis/ # 分析模块
│ │ ├── __init__.py
│ │ └── analyzer.py # 响应分析
│ └── utils/ # 工具模块
│ ├── __init__.py
│ ├── constants.py # 常量定义
│ └── helpers.py # 工具函数
├── README.md
├── .gitignore
└── requirements.txt
## 功能特性
- **16 种 Fuzz 策略**:后缀绕过、Content-Disposition 变异、Content-Type 伪造、大小写变换、双扩展名、空字节注入、特殊字符、编码绕过、WAF 绕过、Magic Bytes、Windows/Linux 特性、配置文件、WebShell 内容、save_name POST 参数绕过、save_path GET 参数绕过
- **多语言支持**:PHP / ASP / ASPX / JSP
- **智能响应分析**:自动判定上传成功/失败,支持中英文关键词匹配
- **进度条显示**:简洁的终端输出,进度条 + 错误计数
- **调试模式**:自动保存前 5 个响应包用于排查问题
- **结果自动保存**:疑似绕过的 Payload 保存到 `output/` 目录
- **模块化架构**:低耦合设计,策略可独立扩展
- **文件包含链式利用**:通过 `/include.php` 将任意后缀的上传文件作为 PHP 执行
## 安装
pip install -r requirements.txt
## 快速开始
### 1. 准备请求文件
从 Burp Suite 或浏览器抓包,将原始 HTTP 请求保存为 `input/request.txt`:
POST /upload.php HTTP/1.1
Host: target.com
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary
------WebKitFormBoundary
Content-Disposition: form-data; name="file"; filename="test.php"
Content-Type: text/php
------WebKitFormBoundary--
### 2. 准备 Payload 模板
将上传部分的 multipart 内容保存为 `input/payload.txt`:
Content-Disposition: form-data; name="file"; filename="test.php"
Content-Type: text/php
### 3. 运行
# 使用默认文件 (input/request.txt + input/payload.txt)
python3 main.py
# 指定文件
python3 main.py -r myreq.txt -p mypay.txt
## 使用说明
### 命令行参数
| 参数 | 缩写 | 说明 | 默认值 |
|------|------|------|--------|
| `--request` | `-r` | 原始 HTTP 请求文件路径 | `input/request.txt` |
| `--payload` | `-p` | 上传部分模板文件路径 | `input/payload.txt` |
| `--languages` | `-l` | 目标后端语言 (php/asp/aspx/jsp) | 全部 |
| `--output` | `-o` | 测试结果输出文件 | 仅终端显示 |
| `--proxy` | | 代理地址 | 无 |
| `--timeout` | | 请求超时时间 (秒) | 10 |
| `--delay` | | 请求间隔 (秒) | 0 |
| `--max-payloads` | | 最大生成 Payload 数 | 2000 |
| `--dry-run` | | 仅生成 Payload 不发送 | 否 |
| `--no-webshell` | | 不包含 WebShell 内容 | 否 |
| `--enable-strategies` | | 仅启用指定策略 | 全部启用 |
| `--disable-strategies` | | 禁用指定策略 | 无 |
| `--follow-redirects` | | 跟随 HTTP 重定向 | 否 |
| `--verbose` | `-v` | 详细输出 | 否 |
| `--race-mode` | | 条件竞争模式(Pass-18) | 否 |
| `--race-threads` | | 条件竞争并发线程数 | 20 |
| `--race-rounds` | | 条件竞争上传轮数 | 50 |
| `--include` | | 文件包含链式利用(Pass-11/18) | 否 |
### 使用示例
# 基本用法
python3 main.py
# 指定请求和 Payload 文件
python3 main.py -r myreq.txt -p mypay.txt
# 仅测试 PHP
python3 main.py -l php
# 通过代理发送 (Burp Suite)
python3 main.py --proxy http://127.0.0.1:8080
# 限制数量 + 请求间隔
python3 main.py --max-payloads 100 --delay 0.5
# 仅生成 Payload 不发送 (试运行)
python3 main.py --dry-run
# 仅启用 save_name 和 save_path 策略
python3 main.py --enable-strategies save_name save_path
# 禁用特定策略
python3 main.py --disable-strategies webshell_content
# 结果输出到文件
python3 main.py -o output/result.txt
# 详细模式
python3 main.py -v
# 文件包含链式利用 (Pass-11/18)
python3 include_bypass.py
python3 include_bypass.py --level 11
### 16 种 Fuzz 策略
| 策略名 | 说明 |
|--------|------|
| `suffix` | 后缀绕过 (php3/php4/php5/phtml/htaccess 等) |
| `content_disposition` | Content-Disposition 字段变异 |
| `content_type` | Content-Type 伪造 (image/jpeg 等) |
| `windows_features` | Windows 特性 (NTFS 流、短文件名等) |
| `linux_features` | Linux 特性 |
| `magic_bytes` | 文件头 Magic Bytes 添加 |
| `null_byte` | 空字节注入 (%00) |
| `double_extension` | 双扩展名 (.php.jpg) |
| `case_variation` | 大小写变换 (.PhP) |
| `special_chars` | 特殊字符绕过 (空格、点号、分号等) |
| `encoding` | 编码绕过 (URL 编码、双编码等) |
| `waf_bypass` | WAF 绕过 (分块传输、注释混淆等) |
| `webshell_content` | WebShell 内容变异 |
| `config_files` | 配置文件上传 (.htaccess、web.config 等) |
| `save_name` | save_name POST 参数注入绕过 (Pass-19/20) |
| `save_path` | save_path GET 参数路径控制绕过 (Pass-11) |
## 输出文件
所有输出文件保存在 `output/` 目录下:
| 文件 | 说明 |
|------|------|
| `output/debug_responses.txt` | 前 5 个请求的完整响应包 (用于调试) |
| `output/payloads_success.txt` | 疑似绕过的 Payload 详情 |
| `output/payloads_dry_run.txt` | 试运行模式下生成的全部 Payload |
### 响应判定
| 判定 | 说明 |
|------|------|
| `LIKELY_SUCCESS` | 疑似上传成功 |
| `LIKELY_FAIL` | 疑似上传失败 |
| `REDIRECT` | 重定向 |
| `FORBIDDEN` | 403 禁止访问 |
| `SERVER_ERROR` | 服务器错误 |
| `CLIENT_ERROR` | 客户端错误 |
| `UNCLEAR` | 无法判定 |
| `No response` | 无响应 |
## 扩展策略
新增策略只需:
1. 在 `upload_fuzz/strategies/` 下创建新文件
2. 继承 `FuzzStrategy` 基类,实现 `generate()` 方法
3. 在 `upload_fuzz/strategies/__init__.py` 中导入
4. 在 `upload_fuzz/core/factory.py` 的 `_register_default_strategies` 中注册
## 条件竞争模式(Pass-18)
`--race-mode` 专门用于测试条件竞争漏洞(如 upload-labs Pass-18)。
### 原理
服务器端逻辑:
1. `move_uploaded_file()` 先将上传文件保存到目录
2. 检查文件是否合法(后缀名等)
3. 不合法则 `unlink()` 删除文件
竞争利用:在文件保存到被删除之间的极短窗口内,通过高频访问触发 PHP 执行。
### 使用的 WebShell
'); ?>
一旦被执行,会在当前目录创建持久的 `shell.php` 后门文件。
### 使用方式
# 基本用法(20线程 × 50轮)
python3 main.py --race-mode
# 自定义并发数和轮数
python3 main.py --race-mode --race-threads 50 --race-rounds 100
### 验证
成功后会自动验证:
1. 检查 `shell.php` 是否存在(返回 200)
2. POST 请求 `shell.php` 执行 `echo "RACE_OK"` 确认 PHP 可执行
3. 成功则提示 shell.php 的 URL 连接信息
## 文件包含链式利用(Pass-11/18)
`include_bypass.py` 利用靶场全局 `/include.php` 文件包含漏洞,将上传文件作为 PHP 执行。
### 原理
`/include.php` 存在文件包含漏洞:
$file = $_GET['file'];
include $file;
无论上传文件后缀是什么(.jpg/.txt/.gif),`include` 均将文件内容作为 PHP 代码执行。
### Pass-11 绕过
1. `?save_path=../upload` 控制上传目录
2. 上传含 PHP 代码的 `test.jpg`
3. `include.php?file=upload/.jpg` 包含执行
4. PHP 代码创建持久化 `shell.php`
### Pass-18 绕过
1. 白名单(无 PHP)内上传 `cmd.txt` 含 PHP 代码
2. `include.php?file=upload.txt` 包含执行
3. PHP 代码 `file_put_contents` 创建 `shell.php` 后门
### 使用方式
# 测试 Pass-11 和 Pass-18
python3 include_bypass.py
# 仅测试 Pass-11
python3 include_bypass.py --level 11
# 仅测试 Pass-18
python3 include_bypass.py --level 18
### 验证
成功后自动验证:
1. 包含执行返回 `INCLUDE_OK`
2. `shell.php` 创建成功
3. POST `shell.php` 执行 `echo "SHELL_OK"` 确认 PHP 可执行
## 注意事项
- 本工具仅供授权安全测试使用,请勿用于非法用途
- 建议先用 `--dry-run` 查看生成的 Payload,确认无误后再发送
- 使用 `--delay` 参数控制请求频率,避免对目标造成过大压力
- 通过 `--proxy` 参数配合 Burp Suite 等工具进行详细分析
## 相关推荐
- [upload-labs](https://github.com/c0ny1/upload-labs) - 文件上传漏洞靶场(Pass-18 条件竞争)
- [Burp Suite](https://portswigger.net/burp) - 配合代理进行请求分析
- [渗透测试工具集](https://github.com/topics/pentest-tools)
## Author
**Diger_Young**
标签:CISA项目, Python, 无后门, 逆向工具