【SRC漏洞挖掘系列】第10期:GraphQL & API 安全 —— 现代 API 的“裸奔”时代

上期回顾 :我们用 XXE 读了系统文件,用反序列化给程序"下毒"。本期换个口味,聊聊现代开发最爱用的 GraphQL ​ 和那些年我们挖过的 API 坑。

如果你还在用传统 Web 漏洞的思路去测 API,那你就像是在用算盘算火箭轨道------完全不对路。🚀


一、GraphQL:一把双刃剑

GraphQL 是一种用于 API 的查询语言。它的优点是:前端要什么数据,后端给什么数据(按需分配)。

缺点也很明显:开发者经常忘了鉴权。

1. 内省查询(Introspection):把后端的底裤扒光

GraphQL 默认开启"内省"功能。这意味着你可以像问数据库一样,问服务器:"你有哪些表?有哪些字段?"

Payload:

graphql

复制代码
{
  __schema {
    types {
      name
      fields {
        name
        type {
          name
        }
      }
    }
  }
}

结果:

服务器会返回一份完整的 API 文档!

你看到了 User、Order、Admin等对象,以及它们的字段(如 passwordHash, email)。

SRC 提示 :如果生产环境没关内省,直接给 中危。

2. 批量查询(Batch Query):DoS 攻击

GraphQL 允许在一个请求里查 N 个数据。

攻击思路:

graphql

复制代码
query {
  user1: user(id: 1) { name }
  user2: user(id: 2) { name }
  # ... 重复一万次
  user10000: user(id: 10000) { name }
}

结果:服务器 CPU 直接飙满,拒绝服务(DoS)。

3. 越权查询(IDOR in GraphQL)

这是最致命的。

请求:

graphql

复制代码
{
  user(id: "1001") {
    username
    email
    isAdmin
    passwordHash  # 甚至能查密码哈希!
  }
}

操作 :把 id从 1001改成 1000(管理员)。

结果:直接拖出管理员账号信息。


二、RESTful API 的经典"翻车"现场

除了 GraphQL,传统的 API 也有一堆坑。

1. 参数污染(HPP)

场景 :API 接收 ?id=1。

攻击 :?id=1&id=2&id=3。

后端解析:

  • PHP/Apache:只取最后一个 id=3。

  • Node.js:得到数组 [1,2,3]。

    利用:绕过 WAF 对某些参数的过滤,或者导致逻辑混乱。

2. JWT 认证绕过

JWT (JSON Web Token) 常用于 API 认证。

漏洞点:

  • None 算法 :把 alg改成 none,去掉签名,服务器可能照单全收。

  • 弱密钥 :用工具 jwt_tool爆破密钥。如果密钥是 secret,一秒破解。

    Payload:

json

复制代码
{
  "alg": "none",
  "typ": "JWT"
}

结果:伪造管理员 Token,接管账号。

3. 过度数据暴露(Over-exposure)

场景:前端只显示昵称,但 API 返回了全部信息。

请求 :GET /api/user/1

响应:

json

复制代码
{
  "nickname": "老王",
  "phone": "13800138000",
  "idCard": "110101199003071234", // 敏感信息泄露
  "isAdmin": false
}

SRC 评级 :高危。虽然前端没显示,但数据已经泄露了。


三、实战案例:API 组合拳

  1. 发现 :/graphql端点开启内省。

  2. 枚举 :找到 query { users { id, email } }。

  3. 越权 :尝试查询 users(id: "admin")成功。

  4. 接管 :如果 API 有修改密码接口 POST /api/user/resetPassword,结合越权,直接改掉管理员密码。


四、SRC 报告撰写指南

漏洞描述 厂商看法 评级
GraphQL 开启内省 知道了,关掉 低危/中危​
API 返回明文密码 严重事故 高危​
GraphQL 越权拖库​ 灾难级 **严重 (Critical)**​

报告话术:

"由于 GraphQL 接口未对查询权限进行校验,攻击者可构造恶意查询语句,批量导出全站用户的敏感信息(手机号、邮箱、密码哈希),导致大规模数据泄露。"


五、互动与思考

💬 互动话题:

大家挖 API 漏洞时,最喜欢用什么工具?

是 Postman 、Burp Suite ​ 的 Autorize ​ 插件,还是专门挖 GraphQL 的 InQL?

有没有遇到过那种"API 返回了整个数据库"的爽文时刻?😂


⚠️ 法律红线警示

  1. 严禁 利用 GraphQL 内省查询进行大规模数据爬取 或拖库。

  2. 严禁尝试爆破 JWT 密钥后,伪造他人身份登录系统。

  3. 严禁 利用批量查询进行真实的 DoS/DDoS​ 攻击,测试时请将数量限制在 10-20 次以内。

  4. 测试原则:

    • 仅在自己的测试账号下验证数据过度暴露。

    • 不要尝试修改他人的数据。

    • 发现越权漏洞,验证 1-2 个账号即可停止。

      **API 是数据的通道,请只做通道的检查者,不要做数据的搬运工。**​ 🛡️

下一期,我们将进入 "移动端安全(Android/iOS)"------ APP 里的那些猫腻"。想知道怎么绕过 SSL Pinning 抓 HTTPS 包吗?敬请期待!📱

相关推荐
猿究院_夏燊3 小时前
Spring Bean 生命周期
java·后端·spring
无障碍研究院4 小时前
2026TADC|圆桌对话:出海无障碍合规
安全·web安全
CCblandy4 小时前
雪花 ID 四个边界实测:时钟回拨重号 500 个,前端 JSON.parse 直接丢精度
后端·python·算法·性能优化·架构
我是人✓4 小时前
SpringBoot项目的五种创建方式
java·spring boot·后端
持敬chijing5 小时前
白盒测试与代码审计-js登录逆向实战
javascript·网络·安全·web安全·网络安全·网络攻击模型
无障碍研究院5 小时前
2026TADC|圆桌对话:软/硬件无障碍的过去、现在、未来
安全
乔旭伟5 小时前
Linux 服务器安全加固实战:SSH、防火墙、补丁与入侵排查
linux·服务器·安全
裕晟资质规划6 小时前
三类涉密资质延续时限差异分析:军工60日与集成印制3个月的边界
java·服务器·前端·网络·安全
念念清晰6 小时前
000-OpenJDK17 源码构建:MacOS环境(M芯片)
java·后端
来福猿6 小时前
SpringCloud Config 源码分析:配置拉取、刷新与多环境管理
后端·spring·spring cloud