文章总结: 本文作者分享了其在一个GraphQLAPI应用中发现两个漏洞并获得2500美元赏金的经验。第一个是IDOR(越权访问)漏洞,通过绕过禁用的内省功能获取schema信息,进而测试并发现了可利用的数字ID参数,导致client_secret泄露,获得500美元奖励。第二个是服务器未正确验证Content-Type导致的非JSONCSRF漏洞,攻击者可伪造请求执行敏感操作,该高危漏洞为作者赢得了2000美元赏金。 综合评分: 85 文章分类: WEB安全,渗透测试,实战经验,红队,解决方案
2500 美元漏洞赏金:破解 GraphQL
原创
漏洞集萃 漏洞集萃
漏洞集萃
2025年3月29日 21:40 中国香港
#
#
在这篇文章中,我将分享自己在 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》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。









评论