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
标签:逆向工具