fewftybet/Upload_Auto_Fuzz

GitHub: fewftybet/Upload_Auto_Fuzz

一款自动化文件上传漏洞Fuzz测试工具,通过智能Payload变异与多种绕过策略帮助发现上传接口的安全缺陷。

Stars: 0 | Forks: 0

# Upload Auto Fuzz

GitHub Stars License Python Status Platform

**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, 无后门, 逆向工具