Peterc3-dev/graphql-authz-fuzzer
GitHub: Peterc3-dev/graphql-authz-fuzzer
用于检测GraphQL API作用域限制的模糊测试工具。
Stars: 0 | Forks: 0
# gql-authz-fuzz
自动化的 GraphQL 变更授权模糊测试工具。测试受限令牌(例如,只读)是否可以访问写变更解析器。
**无依赖。** 仅使用 Python 3.8+ 标准库。
## 功能说明
1. 通过内省下载完整的 GraphQL 模式
2. 使用假 ID、枚举值和无效字符串自动生成每个变更的有效形状输入
3. 使用您的令牌发送每个变更并分类响应
4. 报告哪些变更实施了作用域限制,哪些达到了解析器
关键见解:如果只读令牌收到“资源未找到”或“权限拒绝”错误,而不是“作用域不足”错误,则解析器 *已运行* —— 这意味着 GraphQL 层缺少作用域限制。
## 安装
```
pip install -e .
# 直接运行:
python -m gql_authz_fuzzer https://target.com/graphql --token
```
## 快速开始
```
# 基本用法 — 检查并测试所有突变
gql-authz-fuzz https://target.com/api/graphql --token
# 仅保存模式(重建阶段)
gql-authz-fuzz https://target.com/api/graphql --schema-only -o ./recon
# 使用保存的模式 + 自定义速率限制
gql-authz-fuzz https://target.com/api/graphql \
--schema ./recon/schema.json \
--token \
--delay 1.0
# 恢复中断的扫描
gql-authz-fuzz https://target.com/api/graphql --token --resume
# GitLab 特定(具有模糊错误模式)
gql-authz-fuzz https://gitlab.com/api/graphql \
--token glpat-xxxxx \
--id-format "gid://gitlab/{model}/999999999" \
--ambiguous "the resource that you are attempting to access does not exist or you don't have permission"
```
## 工作原理
### 第 1 步:模式分析
该工具通过内省目标 GraphQL 模式以发现所有变更及其输入类型。对于每个变更,它从 `input` 参数的 INPUT_OBJECT 类型中提取所需的字段。
### 第 2 步:输入生成
对于每个所需字段,该工具根据字段类型生成一个假值:
| 类型种类 | 策略 | 示例 |
|-----------|----------|---------|
| SCALAR (String) | 标记字符串 | `"gql-authz-fuzzer-probe"` |
| SCALAR (Int) | 安全整数 | `1` |
| SCALAR (Boolean) | 假 | `false` |
| ENUM | 第一个枚举值 | `"GUEST"`, `"LOW"`,等等。 |
| ID 类型 | 假全局 ID | `gid://object/User/999999999` |
| INPUT_OBJECT | 递归到所需字段 | `{"name": "probe", ...}` |
**这些输入故意是无害的。** 假 ID 指向不存在的资源。即使授权通过,变更也会失败,因为目标资源不存在。
### 第 3 步:分类
每个响应被分类为以下类别之一:
| 分类 | 解析器是否达到? | 含义 |
|---------------|-------------------|---------|
| `SCOPE_BLOCKED` | 否 | 令牌作用域被明确拒绝 |
| `SCHEMA_ERROR` | 否 | 请求在模式验证(解析器之前)失败 |
| `RESOLVER_DENIED` | 是 | 服务器特定的模糊授权错误 |
| `ROLE_BLOCKED` | 是 | 明确的权限/角色拒绝 |
| `RESOURCE_ERROR` | 是 | 授权通过,资源未找到 |
| `BUSINESS_ERROR` | 是 | 授权通过,业务逻辑错误 |
| `SUCCESS` | **是** | **变更执行 —— 关键发现** |
关键区别:`SCOPE_BLOCKED` 表示 API 正确实施了令牌作用域。所有其他标记为“解析器是否达到:是”的意味着作用域 **未** 实施 —— 请求通过了授权层到达变更解析器。
## 输出
结果保存到输出目录(默认 `./gql-authz-results/`):
```
gql-authz-results/
├── schema.json # Full introspection dump
├── report.md # Human-readable results with tables
├── results.json # Machine-readable (no response bodies)
├── results-full.json # Full results with raw response bodies
├── skipped.json # Mutations that couldn't be probed
└── checkpoint.json # Resume checkpoint
```
## 命令行选项
```
positional arguments:
endpoint GraphQL endpoint URL
options:
--token, -t Bearer token for authentication
--header, -H Additional HTTP header ('Name: Value'). Repeatable.
--schema, -s Path to saved schema JSON (skips introspection)
--output, -o Output directory (default: ./gql-authz-results)
--delay, -d Delay between requests in seconds (default: 0.5)
--resume Resume from checkpoint
--id-format Format for fake global IDs (default: gid://object/{model}/999999999)
--ambiguous Server-specific ambiguous error phrase. Repeatable.
--schema-only Download schema only, don't probe
--stats Print schema stats and exit
--quiet, -q Suppress per-probe output
```
## 应用场景
### 奖金猎人侦察
从目标下载模式,分析变更计数和类型,然后使用受限令牌测试作用域限制。
### CI/CD 安全网关
使用 `read_only` 作用域令牌在 CI 中运行针对您自己的 API。任何 `SUCCESS` 结果都是失败的测试 —— 只读令牌永远不应该执行写变更。
### 渗透测试
映射 GraphQL API 的完整变更表面并确定哪些变更具有弱或缺少的授权检查。
## 方法论
此工具实现了一种测试 GraphQL 层 **令牌作用域实施** 的技术。前提:
1. GraphQL API 通常使用令牌作用域(例如,`read_api`、`api`、`admin`)来控制访问
2. 作用域实施应该在变更解析器运行之前发生
3. 如果受限令牌达到解析器,则表示缺少作用域实施 —— 即使解析器在其他理由(角色、所有权等)上拒绝请求
**为什么这很重要:** 缺少作用域实施是一个防御深度差距。如果任何解析器具有宽容的授权检查(或一个错误),受限令牌可以执行它们不应执行的写操作。
现实世界示例:[CVE-2025-11340](https://zeropath.com/blog/cve-2025-11340-gitlab-graphql-authorization-brief) —— GitLab `read_api` 令牌可以调用漏洞记录上的写变更,因为 GraphQL 层没有实施作用域。
## 负责任的使用
此工具仅设计用于授权安全测试。请在以下情况下使用它:
- 您自己的应用程序
- 您有权测试授权的应用程序
- 包含 GraphQL API 在范围内的奖金猎人计划
该工具生成故意无害的输入(假 ID、不存在的资源)。它不会提取数据、修改状态或利用漏洞 —— 它只识别缺少作用域实施的地方。
## 许可证
MIT
标签:逆向工具