sentient-zero/GQLHound
GitHub: sentient-zero/GQLHound
一款 Burp Suite 扩展,被动收集并分类代理流量中的 GraphQL 操作,支持变量追踪、状态管理和一键发送到 Intruder 进行模糊测试。
Stars: 0 | Forks: 0
# GQL Hound
一款 Burp Suite 扩展,用于被动发现、分类和模糊测试代理流量中观察到的 GraphQL 操作。
## 问题所在
GraphQL API 将所有内容通过单一端点传输,这使得传统的 Burp 工作流程(浏览、查看代理历史、发送到 Intruder)变得痛苦。你无法按操作排序,无法查看存在哪些变量结构,而且当 Burp 重启时所有数据都会丢失。
## 功能特性
- **被动监控** 代理流量并提取 GraphQL 操作名称和类型
- **编目唯一操作** 在可排序的表格中显示,包含请求计数、观察到的变量结构和主机
- **追踪不同的变量签名** 针对每个操作及其样本值,让你确切知道要模糊测试什么
- **存储原始捕获的请求** 按操作名称和变量结构分组
- **注释代理历史** 使用 `GQL:OperationName` 注释以便过滤/排序
- **高亮显示** 代理历史中的新操作(青色)和批量 mutation(橙色)
- **右键发送到 Intruder** 并在所有变量值上自动标记 payload 位置
- **右键发送到 Repeater** 并保留原始请求上下文(headers, cookies, auth)
- **处理批量请求** -- 在发送前从 JSON 数组中提取单个操作
- **状态跟踪** -- 通过下拉菜单将操作标记为 New / In Progress / Postponed / Done / Ignored
- **导出/导入** 完整状态到 JSON,用于 Burp 重启后的会话持久化或团队共享
## 安装说明
1. 确保在 Burp 中配置了 Jython:Extender > Options > Python Environment
2. Extender > Extensions > Add
3. Extension type: **Python**
4. 选择 `gql_hound.py`
## 使用方法
### 发现
通过 Burp 代理浏览目标应用程序。该扩展被动捕获每个 GraphQL 操作并填充 **GQL Hound** 标签页。
点击上方表格中的任何操作,即可在下方表格中查看所有观察到的变量路径,以及样本值和频率计数。
### 分类
使用每个操作上的 **Status** 下拉菜单来跟踪测试进度。按 Status 列排序以集中你的工作。
### 模糊测试
**右键单击某个操作** 查看子菜单,其中列出了每个观察到的变量结构(例如,“3 vars: name, email, role (12x)”):
- **Send to Repeater** -- 按原样发送原始捕获的请求
- **Send to Intruder** -- 重新序列化 body 并自动将每个变量值标记为 Intruder 位置
- **Merged** -- 将所有观察到的变量合并到一个请求中,并使用 `FUZZ` 占位符进行参数污染测试
**右键单击下方表格中的变量行**,以仅将选定的变量作为 Intruder 位置发送。
### 会话持久化
- **Export** -- 将操作、变量、状态和完整原始请求(base64)保存到 JSON
- **Import** -- 恢复所有内容,包括对导入请求的右键发送到 Intruder 功能
使用 `gql_diff.sh` 比较两个导出文件,并查找缺失的操作、状态更改或丢失的请求结构。
## 仓库内容
```
gql_hound.py # Burp Suite extension
gql_diff.sh # Export comparison script
```
## 已知的 Jython 陷阱
- **源码中的非 ASCII 字符**: Jython 2.7 需要 `# -*- coding: utf-8 -*-` 头部。保持注释仅含 ASCII。
- **List 转 Java List**: `sendToIntruder()` 需要 `java.util.ArrayList`,而不是 Python list,用于偏移对。
- **`analyzeRequest()` body offset**: 使用带有 `IHttpService` 的双参数重载版本。单参数版本在没有服务上下文时计算错误。
- **Intruder 位置顺序**: 位置必须按字节偏移升序排列。当 `columns[10]` 排在 `columns[1]` 之前时,按路径名排序会出错。
- **批量 JSON 数组**: 任何接触请求 body 的方法都必须检查 `isinstance(data, list)` 并在调用 dict 方法之前提取目标操作。
## 致谢
为那些厌倦了在 JSON 数据块中 grep 操作名称的手动测试人员而构建。
**sentient-zero** | [GitHub](https://github.com/sentient-zero) | 你的 GraphQL 操作现在有了猎犬
## 许可证
MIT
标签:API 安全测试, Burp Suite 插件, CISA项目, DNS枚举, Fuzzing, GitHub, GraphQL 安全, Intruder, Jython, Mutation 检测, Python, Repeater, Schema 发现, Web 安全, Web 渗透测试, 代理流量, 安全工具库, 抓包分析, 无后门, 渗透测试辅助, 网络安全工具, 被动侦察, 请求分析, 逆向工具