在查找GraphQL API漏洞 之前,首先需要找到其终端节点,这是因为GraphQL API 对所有请求使用相同的终端节点。可手动查找也可借助工具自动查找。
/api/graphql
/graphql/api
/graphql/graphql
如果是有效的 GraphQL 端点,在响应中看到类似于以下内容的结果:
{
"data": {
"__typename": "Query"
}
}
GraphQL 服务通常会使用“查询不存在”或类似错误来响应任何非 GraphQL 请求。如果没有响应可以尝试将 /v1 附加到路径。
为了挖掘更多的GraphQL信息,可以使用内省Introspection来了解 GraphQL API 底层架构信息,内省Introspection是 GraphQL 内置的一个功能,它允许您查询服务器以获取有关架构的信息,例如可用的类型、字段、枚举等。通过使用内省Introspection,可以了解如何与 GraphQL API 交互,并发现潜在的敏感数据。内省Introspection查询通常以 __schema 或 __type 开头,它们是 GraphQL 的保留字段,用于获取架构的元数据信息。内省Introspection功能可能会暴露一些敏感信息,例如数据库表结构、字段描述等。一般生产环境中是禁止开启的,但也有意外,可以使用以下查询是否开启了内省Introspection功能,如果开启了,将返回所有可用查询的名称:
{
"query": "{__schema{queryType{name}}}"
}
对内省查询的响应可能包含大量信息,但通常很长且难以处理。可以使用 GraphQL 可视化工具更轻松地查看架构实体之间的关系,包括操作和类型之间的关系。
如果还不行,还可以通过替代请求方法来挖掘,因为内省(Introspection)可能被配置为仅接受特定的请求方法或内容类型。如果默认的请求方法不起作用,可以尝试使用替代的请求方法来运行内省探测。如使用 GET 请求(默认内省可能只能通过 POST 禁用)或者使用 POST 请求并将 Content-Type 设置为 application/x-www-form-urlencoded。
GraphQL具有某种速率限制器,目的是防止暴力攻击。GraphQL 中有别名(alias)功能,主要是用来减少API的调用次数,也就是说GraphQL 中有查询速率限制器的功能,但是它是一把双刃剑,别名可以有效地在单个 HTTP 消息中发送多个查询,因此别名可以绕过速率限制器;因为速率限制器根据收到的 HTTP 请求数而不是在终端节点上执行的操作数来工作的。别名(alias)允许用户为查询中的字段指定一个不同的名称。这使得用户能够在单个HTTP请求中执行多个查询,例如如果一个速率限制器限制每个IP每分钟只能发送10个请求,那么通过使用别名,用户可以在一个请求中执行10个甚至更多的查询,从而绕过这个限制。
原文始发于微信公众号(老付话安全):漏洞利用之高级API查询语言GraphQL漏洞
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论