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

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


一、GraphQL:一把双刃剑

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

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

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

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

Payload

graphql

{
  __schema {
    types {
      name
      fields {
        name
        type {
          name
        }
      }
    }
  }
}

结果

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

你看到了 UserOrderAdmin等对象,以及它们的字段(如 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  # 甚至能查密码哈希!
  }
}

操作:把 id1001改成 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 漏洞时,最喜欢用什么工具?

PostmanBurp Suite​ 的 Autorize​ 插件,还是专门挖 GraphQL 的 InQL

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


⚠️ 法律红线警示

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

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

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

  4. 测试原则

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

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

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

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

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

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐