漏洞利用之高级API查询语言GraphQL漏洞

admin 2024年12月4日22:21:02评论19 views字数 2199阅读7分19秒阅读模式

在查找GraphQL API漏洞 之前,首先需要找到其终端节点,这是因为GraphQL API 对所有请求使用相同的终端节点。可手动查找也可借助工具自动查找。

在 GraphQL 中,每个 GraphQL 端点都有一个名为 __typename 的保留字段,该字段以字符串形式返回查询对象的类型。通过发送一个通用查询 query { __typename } 到任何 GraphQL 端点,如果该 URL 对应于一个 GraphQL 服务,那么它会在响应中包含字符串 "data": { "__typename": "Query" },是一种可以探测 URL 是否对应于 GraphQL 服务的有用工具。

和API漏洞一样,我们也要了解常用的端节点名称,可将通用查询 query { __typename } 发送到以下常见的 URL 后缀,以检查它们是否是有效的 GraphQL 端点。如:

/graphql

/api/graphql

/graphql/api

/graphql/graphql

如果是有效的 GraphQL 端点,在响应中看到类似于以下内容的结果:

{  "data": {    "__typename": "Query"  }}

GraphQL 服务通常会使用“查询不存在”或类似错误来响应任何非 GraphQL 请求。如果没有响应可以尝试将 /v1 附加到路径。

在现实中,为了防止安全风险,GraphQL 终端节点仅接受 content-type 为 application/json 的 POST 请求。因为 JSON 格式的请求体不容易被伪造。然而,有些 GraphQL 终端节点可能会接受替代的方法,例如使用 x-www-form-urlencoded 内容类型的 GET 请求或 POST 请求。这是由于特定的应用程序需求或遗留系统的兼容性要求。如果无法通过向常见的终端节点发送 POST 请求来找到 GraphQL 终端节点,您可以尝试使用替代的 HTTP 方法重新发送通用查询。例如,可以尝试使用 GET 请求或设置 content-type 为 x-www-form-urlencoded 的 POST 请求。这可能还会增加 CSRF 攻击的风险。

为了挖掘更多的GraphQL信息,可以使用内省Introspection来了解 GraphQL API 底层架构信息,内省Introspection是 GraphQL 内置的一个功能,它允许您查询服务器以获取有关架构的信息,例如可用的类型、字段、枚举等。通过使用内省Introspection,可以了解如何与 GraphQL API 交互,并发现潜在的敏感数据。内省Introspection查询通常以 __schema 或 __type 开头,它们是 GraphQL 的保留字段,用于获取架构的元数据信息。内省Introspection功能可能会暴露一些敏感信息,例如数据库表结构、字段描述等。一般生产环境中是禁止开启的,但也有意外,可以使用以下查询是否开启了内省Introspection功能,如果开启了,将返回所有可用查询的名称:

{        "query": "{__schema{queryType{name}}}"    }

对内省查询的响应可能包含大量信息,但通常很长且难以处理。可以使用 GraphQL 可视化工具更轻松地查看架构实体之间的关系,包括操作和类型之间的关系。

如果内省Introspection功能禁用,也可以使用 GraphQL Suggestions  建议功能,来收集有关 API 结构的信息。服务器可以在错误消息中建议查询修正。这些通常用于查询略微不正确但仍可识别的情况(例如, There is no entry for 'productInfo'. Did you mean 'productInformation' instead? )。Clairvoyance 工具可以使用建议自动恢复全部或部分 GraphQL 架构,即使禁用了内省也是如此。这使得从建议响应中拼凑信息的时间大大减少。

还可以通过在 __schema 关键字后插入特殊字符来运行内省功能,可在__schema 关键字后插入空格、换行符和逗号等字符,因为它们会被 GraphQL 忽略,可以绕过正则表达式的过滤。

如果还不行,还可以通过替代请求方法来挖掘,因为内省(Introspection)可能被配置为仅接受特定的请求方法或内容类型。如果默认的请求方法不起作用,可以尝试使用替代的请求方法来运行内省探测。如使用 GET 请求(默认内省可能只能通过 POST 禁用)或者使用 POST 请求并将 Content-Type 设置为 application/x-www-form-urlencoded。

GraphQL具有某种速率限制器,目的是防止暴力攻击。GraphQL 中有别名(alias)功能,主要是用来减少API的调用次数,也就是说GraphQL 中有查询速率限制器的功能,但是它是一把双刃剑,别名可以有效地在单个 HTTP 消息中发送多个查询,因此别名可以绕过速率限制器;因为速率限制器根据收到的 HTTP 请求数而不是在终端节点上执行的操作数来工作的。别名(alias)允许用户为查询中的字段指定一个不同的名称。这使得用户能够在单个HTTP请求中执行多个查询,例如如果一个速率限制器限制每个IP每分钟只能发送10个请求,那么通过使用别名,用户可以在一个请求中执行10个甚至更多的查询,从而绕过这个限制。

END

原文始发于微信公众号(老付话安全):漏洞利用之高级API查询语言GraphQL漏洞

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年12月4日22:21:02
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   漏洞利用之高级API查询语言GraphQL漏洞https://cn-sec.com/archives/3465118.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息