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, 安全测试, 密码管理, 底层编程, 攻击性安全, 无后门, 逆向工具