开始攻击GarphQL吧!

admin 2024年4月22日01:09:50评论2 views字数 3731阅读12分26秒阅读模式
免责声明:
请勿利用文章内的相关技术从事非法测试,如因此产生的一切不良后果与文章作者和本公众号无关。如有侵权烦请后台告知,我们会立即删除并致歉。谢谢

开始攻击GarphQL吧!

快将此公众号设置为星标🌟🌟🌟吧,获取到第一手推送信息!

开始攻击GarphQL吧!

GraphQL是一种受到在线数据存储和协作平台Meta、Instagram和Google Sheets结构和功能启发的查询语言。本文将向您展示如何利用其某些薄弱环节。

发展历史

Facebook于2012年开发了GraphQL,然后在2015年将其开源。

它的设计目的是让应用程序能够查询存储在数据库或API中的数据和功能,而无需了解内部结构或功能。

它利用源和引擎之间交换的结构信息来执行查询优化,例如去除冗余并仅包含与当前操作相关的信息。

要使用GraphQL,因为它是一种查询语言(意味着您必须知道如何编码),许多人选择使用平台来完成繁重的工作。

像纽约时报、PayPal甚至Netflix这样的公司已经开始使用Apollo,涉足到GraphQL的领域。

Apollo

Apollo Server是一个开源的、符合规范的工具,与任何GraphQL客户端兼容。它构建了一个可用于生产环境的、自我文档化的GraphQL API,可以使用来自任何源的数据。

Apollo GraphQL有三个主要工具,并且有很好的文档支持。

  • 客户端:

    一个客户端库,帮助您解析GraphQL API,并缓存接收到的数据。

  • 服务器:

    一个将您的GraphQL模式连接到服务器的库。它的工作是与后端通信,根据客户端的请求发送回响应。

  • 引擎:

    在Apollo客户端和Apollo服务器之间跟踪错误、收集统计信息,并执行其他监控任务。

我们现在明白了GraphQL是一种查询语言,而Apollo是符合规范的GraphQL服务器。

渗透测试者的视角

有什么比崭新且发展中的技术更令人兴奋的呢?

Apollo似乎是山上的王者,但问题在于Apollo环境的发展是动态而快速的。

它的受欢迎程度与GraphQL一起增长,似乎在地平线上没有真正的竞争对手,因此看到越来越多的实施也就不足为奇了。

对于开发人员来说,最困难的部分是为每个请求设置适当的访问控制,并实现一个可以与访问控制集成的解析器。

另一个关键点是不断发布新版本的新版本带来新的bug。

INTROSPECTION

批量攻击、SQL注入以及泄露信息的调试操作是在实现GraphQL时已知的漏洞。

本文将重点关注内省(Introspection)。

内省是GraphQL的内置功能,使您能够查询服务器关于模式的信息。

内省帮助您了解如何与GraphQL API交互。

它还可以揭示潜在的敏感数据,例如描述字段。

内省使您能够查询GraphQL服务器使用的模式信息。

我们谈论的是字段、查询、类型等等。

内省主要用于发现和在开发阶段作为诊断工具。

在生产系统中,通常不希望任何人都知道如何针对敏感数据运行查询。

但一旦他们知道了,他们就可以利用这种能力。

例如,在启用了内省的生产系统中,以下字段包含了可以被任何人查询的有趣信息:

开始攻击GarphQL吧!

让我们尝试下

想要获取这种级别的信息有几种方式。

其中一种方法是使用Burp Suite和GraphQL Raider插件。

该插件允许您隔离查询语句并对查询进行实验。

例如,拦截到一个针对“/graphql”的post请求,您可能会在请求体中看到一个查询,如下所示:

想要获取这种级别的信息有几种方式。

其中一种方法是使用Burp Suite和GraphQL Raider插件。该插件允许您隔离查询语句并对查询进行实验。

例如,拦截到一个针对“/graphql”的post请求,您可能会在请求体中看到一个查询,如下所示:

开始攻击GarphQL吧!

使用Burp Repeater和GraphQL,我们可以修改请求体中的查询,并执行一个关于“name”的内省查询以查看响应。

在了解到GraphQL正在使用的情况下,我们使用Burp扩展程序GraphQL Raider来专注于查询。

在这里,我们请求标准GraphQL请求中的字段名称。

但是,一旦建立了地基,可以将其更改为各种组合以获取更多结果。

开始攻击GarphQL吧!

这个请求是通过“name”检查所有“types”的“schema”。右侧是对该查询的响应。

开始攻击GarphQL吧!

进一步查看接收到的响应,我们发现响应中有一个“name”: “allUsers”的字段。本质上,我们请求服务器提供包含“name”信息的信息。

响应给出了一个庞大的结果,我们发现了“allUsers”。如果我们查询了这个特定字段,很可能会提供所有用户的信息。

另一个选择是使用CURL。您可以通过将信息放置在curl语句中来执行相同的操作。因此,与上面相同的请求在Curl中的转换类似于:

开始攻击GarphQL吧!

您也可以选择在浏览器地址栏中执行此操作,但有时会有些反复无常。因此,您可以看到在没有任何身份验证的情况下开始揭示大量信息的过程是多么容易。

更令人担忧的是系统提供的描述性错误,这些错误可以帮助恶意攻击者成功。在这里,我们使用了不同的curl语句发送到服务器。这是相同的请求,只是查询的目标是“system”。

开始攻击GarphQL吧!

当服务器无法满足请求时,它会尽力推荐一个合法的字段请求。这使得恶意攻击者如果需要的话,可以逐个错误地制定和构建语句:

开始攻击GarphQL吧!

渗透测试工具箱

道德黑客应该明智地将这个完整请求添加到他们的工具箱中,因为它应该提供一个完整的请求,其中包括对象、字段、突变、描述等长列表:

{__schema{queryType{name}mutationType{name}subscriptionType{name}types{...FullType}directives{name description locations args{...InputValue}}}}fragment FullType on __Type{kind name description fields(includeDeprecated:true){name description args{...InputValue}type{...TypeRef}isDeprecated deprecationReason}inputFields{...InputValue}interfaces{...TypeRef}enumValues(includeDeprecated:true){name description isDeprecated deprecationReason}possibleTypes{...TypeRef}}fragment InputValue on __InputValue{name description type{...TypeRef}defaultValue}fragment TypeRef on __Type{kind name ofType{kind name ofType{kind name ofType{kind name ofType{kind name ofType{kind name ofType{kind name ofType{kind name}}}}}}}}

道德黑客可能也希望将这些添加到他们的目录暴力攻击中:

  • /graphql
  • /graphiql
  • /graphql.php
  • /graphql/console

结论

在生产环境中使用GraphQL内省可能会暴露敏感信息并扩大攻击面。最佳实践建议在生产环境中禁用内省,除非有特定的使用案例。

即使在这种情况下,也要考虑仅允许经过授权的请求进行内省,并采用深度防御的方法。

您可以通过在Apollo Server实例上设置introspection配置键的值来在生产环境中关闭内省。

在生产系统中关闭Introspection的正确配置方法如下,这是一个新的Apollo服务器。

开始攻击GarphQL吧!

尽管本文仅涉及内省,但GraphQL/Apollo仍然容易受到我在开头提到的攻击的影响——批量攻击、SQL注入以及泄露信息的调试操作——我们将在公众号随后的文章中对此进行讨论。

然而,最简单和最常见的攻击向量是内省。

幸运的是,它有一个同样简单的解决方案:关闭它。

案例实战

Tips:

上面提到的端点可以加入OneScan (网上还有更多的端点)

/graphql
/api
/api/graphql
/graphql/api
/graphql/graphql
/graphql/console
/graphql.php
/graphiql.php
...
开始攻击GarphQL吧!

假设我们遇到一个这样的请求

开始攻击GarphQL吧!

就可以右键查看是否支持内省语法,支持的话就会返回所有模式和结构。

开始攻击GarphQL吧!

发送后,成功的话,会有返回结果,将结果粘贴到

https://graphql-kit.com/graphql-voyager/

开始攻击GarphQL吧!

然后可以很直观看到,数据的结构

开始攻击GarphQL吧!

接着,我们构造指定的ID然后增加字段postPassword,就能获取到某个隐藏字段的信息(实际危害就是泄漏用户的敏感信息)

query getBlogSummaries {
getBlogPost(id:3) {
image
title
summary
id
postPassword
}
}
开始攻击GarphQL吧!

Origin Source from :

https://raxis.com/blog/exploiting-graphql/

开始攻击GarphQL吧!

原文始发于微信公众号(一个不正经的黑客):开始攻击GarphQL吧!

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年4月22日01:09:50
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   开始攻击GarphQL吧!https://cn-sec.com/archives/2676673.html

发表评论

匿名网友 填写信息