GraphQL 风格的测试(下部分)
常见的 GraphQL 路径
- /graphql
- /graphql-console
- /graphql-devtools
- /graphql-explorer
- /graphql-playground
- /graphql-playground-html
- /graphql.php
- /graphql/console
- /graphql/graphql
- /graphql/graphql-playground
- /graphql/schema.json
- /graphql/schema.xml
- /graphql/schema.yaml
- /graphql/v1
- /HyperGraphQL
- /je/graphql
- /laravel-graphql-playground
- /lol/graphql
- /portal-graphql
- /v1/api/graphql
- /v1/graphql
- /v1/graphql-explorer
- /v1/graphql.php
- /v1/graphql/console
- /v1/graphql/schema.json
- /v1/graphql/schema.xml
- /v1/graphql/schema.yaml
- /v2/api/graphql
- /v2/graphql
- /v2/graphql-explorer
- /v2/graphql.php
- /graph
- /graphql/console/
- /graphiql
- /graphiql.php
内省安全
参考资料:
常见内省攻击方法:
- 模式泄露:通过
__schema查询获取 GraphQL 模式的详细信息,了解 API 结构、类型、字段,甚至发现隐藏或敏感功能。 - 类型混淆:通过查询分析模式,发现类型混淆漏洞(相同名称但不同定义的类型),可能导致意外数据访问或安全问题。
- 字段枚举:通过查询模式,枚举 API 的所有字段和关联关系,了解数据模型、关系和功能,为后续攻击做准备。
- 查询分析:发送大量查询,分析 API 性能和复杂性,发现性能问题、资源消耗过高的查询及潜在漏洞。
- 敏感信息泄露:通过模式分析和查询,尝试获取用户凭据、API 密钥、数据库结构等,若未正确保护,可能导致信息泄露。
绕过内省:
-
特殊字符绕过:使用空格、换行符、逗号等被 GraphQL 忽略的字符。
-
弱正则匹配绕过:修改请求方式或类型绕过防护。
-
示例 Payload:
GET /api?query=query{__typename} GET /api?query=%7b__schema%0a+++++%7bqueryType%7bname%7d%7d%7d -
内省 Payload (枚举数据库模式):
GET /api?query=mutation+deleteOrganizationUser+%7b%0d%0a++++deleteOrganizationUser%28input%3a+%7bid%3a3%7d%29+%7b%0d%0a++++++++user+%7b%0d%0a++++++++++++id%0d%0a++++++++++++username%0d%0a++++++++%7d%0d%0a++++%7d%0d%0a%7dmutation deleteOrganizationUser { deleteOrganizationUser(input: {id:3}) { user { id username } } } -
方法:导入解析 JSON,寻找端点和参数。
安全联动
靶场:
攻击类型:
- XSS 存储型
- RCE 代码执行
- SSRF 请求伪造
- 任意文件上传