GraphQL安全漏洞与防护策略 -- 知识铺
快将此公众号设置为星标🌟🌟🌟吧,获取到第一手推送信息!
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服务器使用的模式信息。
我们谈论的是字段、查询、类型等等。
内省主要用于发现和在开发阶段作为诊断工具。
在生产系统中,通常不希望任何人都知道如何针对敏感数据运行查询。
但一旦他们知道了,他们就可以利用这种能力。
例如,在启用了内省的生产系统中,以下字段包含了可以被任何人查询的有趣信息:
让我们尝试下
想要获取这种级别的信息有几种方式。
其中一种方法是使用Burp Suite和GraphQL Raider插件。
该插件允许您隔离查询语句并对查询进行实验。
例如,拦截到一个针对“/graphql”的post请求,您可能会在请求体中看到一个查询,如下所示:
想要获取这种级别的信息有几种方式。
其中一种方法是使用Burp Suite和GraphQL Raider插件。该插件允许您隔离查询语句并对查询进行实验。
例如,拦截到一个针对“/graphql”的post请求,您可能会在请求体中看到一个查询,如下所示:
使用Burp Repeater和GraphQL,我们可以修改请求体中的查询,并执行一个关于“name”的内省查询以查看响应。
在了解到GraphQL正在使用的情况下,我们使用Burp扩展程序GraphQL Raider来专注于查询。
在这里,我们请求标准GraphQL请求中的字段名称。
但是,一旦建立了地基,可以将其更改为各种组合以获取更多结果。
这个请求是通过“name”检查所有“types”的“schema”。右侧是对该查询的响应。
进一步查看接收到的响应,我们发现响应中有一个“name”: “allUsers”的字段。本质上,我们请求服务器提供包含“name”信息的信息。
响应给出了一个庞大的结果,我们发现了“allUsers”。如果我们查询了这个特定字段,很可能会提供所有用户的信息。
另一个选择是使用CURL。您可以通过将信息放置在curl语句中来执行相同的操作。因此,与上面相同的请求在Curl中的转换类似于:
您也可以选择在浏览器地址栏中执行此操作,但有时会有些反复无常。因此,您可以看到在没有任何身份验证的情况下开始揭示大量信息的过程是多么容易。
更令人担忧的是系统提供的描述性错误,这些错误可以帮助恶意攻击者成功。在这里,我们使用了不同的curl语句发送到服务器。这是相同的请求,只是查询的目标是“system”。
当服务器无法满足请求时,它会尽力推荐一个合法的字段请求。这使得恶意攻击者如果需要的话,可以逐个错误地制定和构建语句:
渗透测试工具箱
道德黑客应该明智地将这个完整请求添加到他们的工具箱中,因为它应该提供一个完整的请求,其中包括对象、字段、突变、描述等长列表:
{__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}}}}}}}}<br>
道德黑客可能也希望将这些添加到他们的目录暴力攻击中:
-
/graphql
-
/graphiql
-
/graphql.php
-
/graphql/console
结论
在生产环境中使用GraphQL内省可能会暴露敏感信息并扩大攻击面。最佳实践建议在生产环境中禁用内省,除非有特定的使用案例。
即使在这种情况下,也要考虑仅允许经过授权的请求进行内省,并采用深度防御的方法。
您可以通过在Apollo Server实例上设置introspection配置键的值来在生产环境中关闭内省。
在生产系统中关闭Introspection的正确配置方法如下,这是一个新的Apollo服务器。
尽管本文仅涉及内省,但GraphQL/Apollo仍然容易受到我在开头提到的攻击的影响——批量攻击、SQL注入以及泄露信息的调试操作——我们将在公众号随后的文章中对此进行讨论。
然而,最简单和最常见的攻击向量是内省。
幸运的是,它有一个同样简单的解决方案:关闭它。
案例实战
Tips:
上面提到的端点可以加入OneScan (网上还有更多的端点)
/graphql<br>/api<br>/api/graphql<br>/graphql/api<br>/graphql/graphql<br>/graphql/console<br>/graphql.php<br>/graphiql.php<br>...<br>
假设我们遇到一个这样的请求
就可以右键查看是否支持内省语法,支持的话就会返回所有模式和结构。
发送后,成功的话,会有返回结果,将结果粘贴到
https://graphql-kit.com/graphql-voyager/
然后可以很直观看到,数据的结构
接着,我们构造指定的ID然后增加字段postPassword
,就能获取到某个隐藏字段的信息(实际危害就是泄漏用户的敏感信息)
query getBlogSummaries {<br> getBlogPost(id:3) {<br> image<br> title<br> summary<br> id<br> postPassword<br> }<br>}<br>
Origin Source from :
https://raxis.com/blog/exploiting-graphql/
往期推荐
[
垃圾,学了没用?Web缓存投毒
[
大学生,垃圾,不配拿工资
[
价值200W的OutLook 0day漏洞???
[
黑客宝宝也会用的开源VPS可视化管理系统
[
[在野0day预警] CVE-2024-3400 Palo Alto Networks PAN-OS 命令执行
[
逮捕!无补丁!Telegram 桌面版0Click 高危漏洞!
IT’S RAINING NOW
合作联系运营微信
微信号:sec1993
IT’S RAINING NOW
点个在看你最好看
- 原文作者:知识铺
- 原文链接:https://index.zshipu.com/geek001/post/20240424/GraphQL%E5%AE%89%E5%85%A8%E6%BC%8F%E6%B4%9E%E4%B8%8E%E9%98%B2%E6%8A%A4%E7%AD%96%E7%95%A5--%E7%9F%A5%E8%AF%86%E9%93%BA/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。
- 免责声明:本页面内容均来源于站内编辑发布,部分信息来源互联网,并不意味着本站赞同其观点或者证实其内容的真实性,如涉及版权等问题,请立即联系客服进行更改或删除,保证您的合法权益。转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。也可以邮件至 sblig@126.com