rbidou/query-fuzzer
GitHub: rbidou/query-fuzzer
针对 HTTP QUERY 方法(RFC 10008)的合规性与漏洞模糊测试工具,通过原始 socket 构造畸形请求来检测服务器实现中的规范偏差和安全缺陷。
Stars: 0 | Forks: 0
# HTTP QUERY fuzzer
一个针对 **HTTP `QUERY` 方法**的合规性与漏洞 fuzzer,定义于
[RFC 10008 – *The HTTP QUERY Method*](https://www.rfc-editor.org/rfc/rfc10008.txt)。
`QUERY` 是一个**安全**且**幂等**的 HTTP 方法,它带有请求体
(类似于 `POST`),但指示的是一个只读查询操作(类似于 `GET`)。由于该
方法较新,服务器实现经常错误处理其规范性要求 —— Content-Type 验证、状态码选择、缓存键
推导、条件请求 —— 并且继承了经典的请求体处理缺陷,例如
长度/编码不匹配、请求走私以及通过
查询体进行注入。
`query_fuzzer.py` 是一个**单文件、仅使用标准库**的工具。它通过**原始 socket** 进行
HTTP/1.1 通信,因此它可以发送故意构造的畸形请求,
而高级客户端(`requests`、`httpx`)会静默地清理这些请求。
## 要求
- Python 3.9+(在 3.12 上开发并测试)。无需第三方包。
- 由于该工具仅使用标准库,虚拟环境是可选的:
python -m venv venv && source venv/bin/activate # 可选
## 用法
```
python query_fuzzer.py [options]
```
示例:
```
# 合规 + injection/parsing 检查(安全,默认 rate-limited 为 10 req/s)
python query_fuzzer.py https://api.example.com --path /search --media sql
# 包含 disruptive 检查(smuggling、oversized 和 slow body)并保存报告
python query_fuzzer.py https://api.example.com --path /search --aggressive --json report.json
# Self-signed 测试目标,不限速,JSON 输出,多个路径
python query_fuzzer.py https://10.0.0.5 --insecure --rate 0 \
--path /search --path /v1/query --json out.json
```
### 选项
| 选项 | 描述 |
| --- | --- |
| `url` | 目标基础 URL,例如 `https://host:443/search`(必填)。 |
| `--path PATH` | 要测试的路径;可重复。覆盖 URL 路径。 |
| `--media {sql,jsonpath,json,xpath,text}` | 查询体媒体类型(默认为 `sql`)。 |
| `--aggressive` | 启用破坏性检查(走私、超大请求体、慢速请求体)。 |
| `--threads N` | 每个目标的并发检查数(默认为 `1`)。 |
| `--rate R` | 最大请求数/秒;`0` = 不限(默认为 `10`)。 |
| `--timeout S` | Socket 超时时间(秒)(默认为 `10`)。 |
| `--max-body N` | 超大请求体检查的请求体大小,单位为字节(默认为 `1 MiB`)。 |
| `--insecure` | 跳过 TLS 证书验证(自签名目标)。 |
| `--header H:V` | 每个请求中发送的额外 header;可重复(例如认证 token)。 |
| `--json FILE` | 输出机器可读的 JSON 报告。 |
| `--no-color` | 禁用 ANSI 彩色输出。 |
| `--yes` | 跳过交互式授权提示(用于 CI)。 |
| `--verbose` | 向 stderr 输出详细的进度信息。 |
**退出码:** 当没有 `VULN`/`FAIL` 发现时为 `0`,当至少存在一个发现时为
`1`(适配 CI),如果未确认授权则为 `2`。
## 它测试什么
每次检查都映射到一项 RFC 10008 要求或一个众所周知的请求体处理缺陷。
发现被分类为 `PASS` / `FAIL`(不合规)/ `VULN`
(与安全相关)/ `WARN`(启发式)/ `INFO` / `SKIP`。
### 合规性与注入(始终运行)
| ID | 检查 |
| --- | --- |
| C1 | 使用 OPTIONS 发现 `Allow` 和 `Accept-Query`。 |
| C2 | 具有受支持 Content-Type 且格式正确的 `QUERY` 会成功。 |
| C3 | 缺少 `Content-Type` 的请求会被拒绝(无内容嗅探)。 |
| C4 | 不支持的媒体类型返回 `415`(理想情况下带有 `Accept-Query`)。 |
| C5 | Content-Type/请求体不匹配不会被嗅探/处理。 |
| C6 | 无法满足的 `Accept` 返回 `406`。 |
| C7 | 格式正确但无意义的查询返回 `422`,而不是泄露信息的 `5xx`。 |
| C8 | 空请求体被拒绝(`QUERY` 必须带有请求体)。 |
| C9 | 方法名称区分大小写(`query`/`Query` 必须被拒绝)。 |
| C10 | 安全启发式:带有修改意图的请求体不应被盲目接受。 |
| C11 | 条件 `QUERY`(`If-None-Match`)返回 `304`。 |
| C12 | 缓存键包含请求体(无缓存投毒冲突)。 |
| C13 | 报告重定向语义(`303`→GET 对比 `301/302/307/308`→QUERY)。 |
| C14 | 针对非白名单方法 `QUERY` 的 CORS 预检。 |
| I1 | header 值中的 CRLF / 响应拆分注入。 |
| I2 | 重复/冲突的 `Content-Type` header(解析器混淆)。 |
| I3 | 格式错误的 `Content-Type` 参数注入。 |
| I4 | 特定格式的请求体注入探测(SQLi / XPath / JSONPath / NoSQL)。 |
| I5 | 空字节和超大的 header 值。 |
### 破坏性检查(仅在使用 `--aggressive` 时)
| ID | 检查 |
| --- | --- |
| A1 | 过多/过少声明的 `Content-Length`。 |
| A2 | `CL.TE` 请求走私不同步探测。 |
| A3 | 超大请求体(探测请求大小限制)。 |
| A4 | 负数 / 非数字 / 极大的 `Content-Length`。 |
| A5 | 格式错误的分块编码边缘情况。 |
| A6 | 有界慢速请求体(Slowloris 风格)读取超时探测。 |
## 安全性
- 在进行任何流量通信之前会运行交互式授权提示(使用 `--yes` 跳过)。
- 默认情况下请求受速率限制(`--rate 10`)。
- 破坏性资源测试是有界的:超大请求体大小受 `--max-body` 限制,
且慢速请求体探测被时间限制在几秒钟内。
- 针对黑盒服务器,副作用(安全/幂等性)和重定向检查本质上是启发式的,
并报告为 `WARN`/`INFO`,绝不作为
高置信度的 `VULN`。
## 注意事项
- 该工具仅读取每个响应的前 ~64 KB,足以获取状态、
header 和错误特征。
- 输出按严重程度分组;传递 `--json` 获取结构化报告,适合
在多次运行之间进行差异对比或输入到其他工具中。
标签:HTTP协议, Python, 安全测试, 密码管理, 底层编程, 攻击性安全, 无后门, 逆向工具