2500 美元漏洞赏金:破解 GraphQL

admin 2025年3月30日21:30:4425 views字数 2475阅读8分15秒阅读模式

在这篇文章中,我将分享自己在 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)操作。这项工作非常耗时,但除此之外,我还能做什么呢?😅

其实,我们还是可以做点什么的!

2500 美元漏洞赏金:破解 GraphQL

在阅读 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 也能返回数据……

2500 美元漏洞赏金:破解 GraphQL

在 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 类型的请求。

2500 美元漏洞赏金:破解 GraphQL

如何构造 CSRF 攻击请求?

  1. 修改 Content-Type,移除请求体(body)。
  2. 将查询参数(query)添加到 URL 中。
  3. Burp Suite 识别为 GraphQL 请求,并在 Repeater 里提供 GraphQL 选项卡。

这样,我们可以重新插入原来的查询或变更操作!

以下是攻击的示例截图👇

2500 美元漏洞赏金:破解 GraphQL

2500 美元漏洞赏金:破解 GraphQL

之后,剩下的部分就很简单了,就像执行普通的 CSRF 攻击

  • 创建 PoC(漏洞利用代码)。
  • 演示漏洞的影响。

为了简化 PoC 生成,我使用了 Burp Suite 的 PoC 生成器,创建了 3 个不同的 PoC,并录制了一段视频,展示如何在用户不知情的情况下执行敏感操作

经过漫长的等待,我的报告终于被审核并标记为高危(High)!🎉

两周后,我收到了 2000 美元的漏洞赏金!🚀

2500 美元漏洞赏金:破解 GraphQL

最后的话

对我来说,漏洞赏金不仅仅是赚钱,它更是一种学习新知识并将其应用于现实世界的乐趣

保持快乐,保持善良!😊

====本文结束====

以上内容由漏洞集萃翻译整理。

原文:

https://blog.koalasec.co/2500-dollars-in-bounties-hacking-graphql

原文始发于微信公众号(漏洞集萃):2500 美元漏洞赏金:破解 GraphQL

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年3月30日21:30:44
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   2500 美元漏洞赏金:破解 GraphQLhttps://cn-sec.com/archives/3898906.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.
评论  2  访客  2
    • ap 0

      你好,hackerone id认证失败怎么回事,他们不接受中国身份证吗

        • admin

          @ ap 啊..现在要身份证认证了吗

      发表评论

      匿名网友 填写信息