在这篇文章中,我将分享自己在 GraphQL API 应用中发现多个漏洞的学习过程和经验。
今年 2 月,我开始学习 GraphQL API 安全,参考了《Black Hat GraphQL》一书,并结合 PortSwigger 的实验室进行实践。学习过程中,我在 HackerOne 上选择了一个私有漏洞赏金项目。令我惊讶的是,该项目的整个基础设施都建立在 GraphQL 之上——这正是我实践学习的完美目标!
接下来,让我们看看我发现的两个漏洞吧!
第一个漏洞:IDOR(我的最爱!)
测试 GraphQL API 应用时,第一步就是检查**内省(introspection)**是否启用。
PortSwigger 对 GraphQL 内省的定义如下:
“内省是 GraphQL 内置的一个功能,允许你查询服务器的 schema 信息。它通常被 GraphQL IDE 和文档生成工具使用。”
如果内省功能开启,我们就可以构造所有请求并进一步测试漏洞!
我使用了 InQL(一个知名的 Burp Suite 插件)来检测内省功能是否启用。结果,出现了错误 😞,这意味着开发者已禁用了内省。所以,我决定从 JavaScript 文件中手动查找查询(query)和变更(mutation)操作。这项工作非常耗时,但除此之外,我还能做什么呢?😅
其实,我们还是可以做点什么的!
在阅读 PortSwigger 的 GraphQL 相关文档时,我注意到许多开发者会禁用 __schema
关键字,但如果他们只禁用了 __schema
,那么以下查询仍然可以绕过限制,获取 schema 信息!
获取查询(Query)字段:
ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line
{
__type(name: "Query") {
fields {
name
args {
name
type {
name
kind
}
}
}
}
}
获取变更(Mutation)字段:
ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line
{
__type(name: "Mutation") {
fields {
name
args {
name
type {
name
kind
}
}
}
}
}
通过这种方式,我成功找到了所有的查询、变更操作及其字段。接下来,我逐个构造请求。为了提高效率,我用 ChatGPT 自动化了这个过程,效果非常棒!
然后,我发现了一个以 ID 作为参数的变更操作。该值是数字类型,这使它成为测试 IDOR(越权访问)漏洞的绝佳目标。
起初,我尝试了 1、2、3,但都返回了 404。我本以为它不具有漏洞,但幸运的是,我决定进一步模糊测试(fuzzing)。最终,我发现 1105 号 ID 响应成功!随后 1110、1120 也能返回数据……
在 Stripe 的文档中提到,client_secret
用于前端支付确认,不应被存储、记录或暴露给除用户以外的任何人。
如果泄露,攻击者可以利用 client_secret
替受害者确认支付,从而导致未授权交易和金融欺诈。
我在漏洞报告中提交了该漏洞的影响描述,但现在回头看,我意识到自己可能没有充分说明漏洞的严重性。HackerOne 的分析员将其评定为中等(Medium),而我认为它应该属于高危(High)。最终,它被定级为 Medium,我获得了 500 美元的奖励。
第二个漏洞:非 JSON CSRF
是的,你没看错!有时候,服务器未能正确验证请求的 Content-Type
,并接受非 JSON 格式的查询和变更请求,这与 GraphQL 预期行为(仅接受 application/json
)相反。
如果这种情况发生,并且服务器未使用 CSRF 令牌(token),攻击者就可以伪造请求,诱骗用户执行已认证的状态变更操作。在我的测试中,我发现自己可以添加管理员、更改用户邮箱,甚至可以执行任意更新/编辑操作。
为了检测这一问题,我使用了 GraphQL-Cop(一个用于测试 GraphQL API 漏洞的开源工具)。如图所示,该工具确认服务器接受 application/x-www-form-urlencoded
类型的请求。
如何构造 CSRF 攻击请求?
-
修改 Content-Type
,移除请求体(body)。 -
将查询参数(query)添加到 URL 中。 -
Burp Suite 识别为 GraphQL 请求,并在 Repeater 里提供 GraphQL 选项卡。
这样,我们可以重新插入原来的查询或变更操作!
以下是攻击的示例截图👇
之后,剩下的部分就很简单了,就像执行普通的 CSRF 攻击:
-
创建 PoC(漏洞利用代码)。 -
演示漏洞的影响。
为了简化 PoC 生成,我使用了 Burp Suite 的 PoC 生成器,创建了 3 个不同的 PoC,并录制了一段视频,展示如何在用户不知情的情况下执行敏感操作。
经过漫长的等待,我的报告终于被审核并标记为高危(High)!🎉
两周后,我收到了 2000 美元的漏洞赏金!🚀
最后的话
对我来说,漏洞赏金不仅仅是赚钱,它更是一种学习新知识并将其应用于现实世界的乐趣。
保持快乐,保持善良!😊
====本文结束====
以上内容由漏洞集萃翻译整理。
原文:
https://blog.koalasec.co/2500-dollars-in-bounties-hacking-graphql
原文始发于微信公众号(漏洞集萃):2500 美元漏洞赏金:破解 GraphQL
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
2025年4月12日 下午12:28 1F
你好,hackerone id认证失败怎么回事,他们不接受中国身份证吗
2025年4月14日 下午7:08 B1
@ ap 啊..现在要身份证认证了吗