omar2535/GraphQLer

GitHub: omar2535/GraphQLer

一款依赖感知的 GraphQL API 安全模糊测试工具,能够自动解析 Schema 并智能生成有效测试用例。

Stars: 161 | Forks: 15

The only dependency-aware GraphQL API testing tool

python3.12
lint unit_test_status integration_test_status

GraphQLer 是一款尖端的工具,旨在动态测试 GraphQL API,并专注于感知能力。它提供了一系列复杂的功能,可简化测试流程并确保对 GraphQL API 进行稳健的分析,例如能够自动读取 Schema 并使用该 Schema 对 API 运行测试。此外,GraphQLer 能够感知对象查询和变更(mutations)之间的依赖关系,并利用这些关系对 API 执行安全测试。
## 主要特性 - **请求生成**:根据 Schema 自动生成有效的查询和变更(*支持基于最新 [GraphQL-spec](https://spec.graphql.org/October2021/#sec-ID) 的片段、联合、接口和枚举*) - **依赖感知**:根据查询和变更的自然依赖关系运行它们 - **资源追踪**:跟踪 API 中发现的任何对象,以供将来使用和侦察 - **错误修正**:尝试修复请求以便 GraphQL API 接受它们 - **统计收集**:将您的结果显示在易于阅读的文件中 - **易于使用**:您只需要端点和身份验证令牌(如果需要) - **可定制性**:更改配置文件以满足您的需求,如果需要,可以通过 Burp 或 ZAP 代理请求 ## 快速入门 可以通过 [pip](https://pypi.org/project/GraphQLer/) 快速安装: ``` pip install GraphQLer python -m graphqler --help ``` 或者使用 [docker](https://hub.docker.com/repository/docker/omar2535/graphqler/general): ``` docker pull omar2535/graphqler:latest docker run --rm omar2535/graphqler --help ``` 有关更深入的指南,请查看 [安装指南](./docs/installation.md)。 ## 用法 ``` ❯ python -m graphqler --help usage: __main__.py [-h] --url URL [--path PATH] [--config CONFIG] --mode {compile,fuzz,idor,run,single} [--auth AUTH] [--proxy PROXY] [--node NODE] [--plugins-path PLUGINS_PATH] [--version] options: -h, --help show this help message and exit --url URL remote host URL --path PATH directory location for files to be saved-to/used-from. Defaults to graphqler-output --config CONFIG configuration file for the program --mode {compile,fuzz,idor,run,single} mode to run the program in --auth AUTH authentication token Example: 'Bearer arandompat-abcdefgh' --proxy PROXY proxy to use for requests (ie. http://127.0.0.1:8080) --node NODE node to run (only used in single mode) --plugins-path PLUGINS_PATH path to plugins directory --version display versionn ``` 以下是将介绍如何使用此程序测试您的 GraphQL API 的步骤。用法分为两个阶段:**编译(compilation)**和**模糊测试(fuzzing)**。 - **编译模式(Compilation mode)**:此模式负责对给定的 API 运行 *内省查询(introspection query)* 并生成依赖关系图 - **模糊测试模式(Fuzzing mode)**:此模式负责遍历依赖关系图并向 API 发送测试请求 为了方便使用,还包括第三种模式,称为 **运行(run)** 模式。此模式将编译和模糊测试模式合并为一个命令。 目前正在开发的模式称为 **IDOR** 模式,该模式将查找可以使用另一个访问令牌访问的重复使用对象。该功能目前处于试验阶段,需要用户先运行 *compile* 和 *fuzzing* 模式。 ### 编译模式 ``` python -m graphqler --mode compile --url --path ``` 编译后,您可以在 `/compiled` 中查看编译结果。此外,还将生成一个名为 `dependency_graph.png` 的图以供检查。编译后的 `.yaml` 文件中的任何 `UNKNOWNS` 都可以手动标记;但是,如果未标记,模糊测试器仍会运行它们,只是不使用依赖链。 ### 模糊测试模式 ``` python -m graphqler --mode fuzz --url --path ``` 在进行模糊测试时,与 GraphQL API 相关的统计信息和任何正在进行的请求计数都会记录在控制台中。任何请求返回代码都会写入 `/stats.txt`。模糊测试期间的所有日志都保存在 `/logs/fuzzer.log` 中。日志文件将准确告诉您哪些请求被发送到哪些端点,以及响应是什么。这可用于进一步的结果分析。对象桶(objects bucket)的副本也可以在 `objects_bucket.pkl` 中找到。 ### IDOR 检查模式 ``` python -m graphqler --mode idor --url --path ``` [不安全的直接对象引用 (IDOR)](https://portswigger.net/web-security/access-control/idor) 模式可以在 **编译(compile)** 模式和 **模糊测试(fuzz)** 模式完成后运行。它需要 `objects_bucket.pkl` 文件已经存在,因为它使用先前运行中的对象桶来查看先前运行中发现/创建的信息是否也可以在新的运行中被引用。 ### 运行模式 同时运行编译模式和模糊测试模式 ``` python -m graphqler --mode run --url --path ``` ### 单一模式 运行单个节点(确保它存在于查询或变更列表中) ``` python -m graphqler --url --path --config > --proxy --mode single --node ``` ## 高级功能 还有一些变量可以通过 `--config` 标志作为 TOML 文件进行修改(参见 `/examples/config.toml` 示例)。这些对应于 GraphQLer 中实现的特定功能,可以根据您的喜好进行调整。 | 变量名 | 变量描述 | 变量类型 | 默认值 | |---------------|---------------------|---------------|---------------| | MAX_LEVENSHTEIN_THRESHOLD | 对象与对象 ID 之间的莱文斯坦距离 | Integer | 20 | | MAX_OBJECT_CYCLES | 同一对象在相同查询/变更中被具体化的最大次数 | Integer | 3 | | MAX_OUTUPT_SELECTOR_DEPTH | 查询/变更输出的最大扩展深度(例如无限递归选择器的情况) | Integer | 3 | | USE_OBJECTS_BUCKET | 是否存储对象 ID 以供将来使用 | Boolean | True | | USE_DEPENDENCY_GRAPH | 是否使用依赖感知功能 | Boolean | True | | ALLOW_DELETION_OF_OBJECTS | 是否允许从对象桶中删除 | Boolean | False | | MAX_FUZZING_ITERATIONS | 在节点上运行的模糊测试负载的最大数量 | Integer | 5 | | MAX_TIME | 最大运行时间(秒) | Integer | 3600 | | TIME_BETWEEN_REQUESTS | 请求之间等待的最长时间(秒) | Integer | 0.001 | | DEBUG | 调试模式 | Boolean | False | | Custom Headers | 随每个请求发送的自定义标头 | Object | `Accept = "application/json"` | | SKIP_MAXIMAL_PAYLOADS | 是否发送包含所有可能输出的负载 | Boolean | False | | SKIP_DOS_ATTACKS | 是否跳过 DOS 攻击(默认为 true 以避免对服务进行 DOS) | Boolean | True | | SKIP_INJECTION_ATTACKS | 是否跳过注入攻击 | Boolean | False | | SKIP_MISC_ATTACKS | 是否跳过杂项攻击 | Boolean | False | | SKIP_NODES | 要跳过的节点(查询或变更名称) | List | [] | ### 插件 您还可以为自定义身份验证(即短令牌生命周期)实现自己的插件。更多信息请参见 [文档](https://github.com/omar2535/GraphQLer/tree/main/docs)。
标签:API安全, CISA项目, Docker, Fuzzing, GraphQL, JSON输出, Python, Python安全, Schema分析, Web安全, 二进制发布, 依赖感知, 安全测试, 安全防御评估, 开源工具, 攻击性安全, 无后门, 网络安全, 蓝队分析, 请求拦截, 隐私保护