【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 包吗?敬请期待!📱

相关推荐
2601_9623649719 分钟前
电脑人脸解锁的安全基石,聊聊 Windows Hello 硬件规范
windows·安全·电脑
IT_陈寒1 小时前
JavaScript闭包的这个坑,我居然今天才爬出来
前端·人工智能·后端
Thneonl1 小时前
消息队列选型决策树:RabbitMQ vs Kafka vs Redis Streams
后端·架构
晚安日记wanna1 小时前
大厂禁 JOIN 的真正原因,拆到第四层才清楚
数据库·后端·面试
dd聊技术1 小时前
LLM 说"你这篇和已有文章 92% 相似",我去查了——它编的
后端
重明链迹实验室2 小时前
重明链迹丨每周区块链安全要闻(0921-0927)
安全·web3·区块链
行百里er2 小时前
Redis 持久化——RDB 快照 vs AOF 日志
redis·后端
Ysx3 小时前
踩了 5 次"本地全绿、生产失效"之后,我把交付流程做成了 SOP
后端·程序员
pippocao3 小时前
王者荣耀日志组件BqLog为什么这么快之2——从环形队列到自适应数据总线
后端
AOXU_Consulting3 小时前
医用吊塔:手术室和 ICU 天花板上那根“臂“是做什么的
安全·健康医疗