从零开始 Attack the GraphQL API
字数 1852 2025-08-22 12:23:41
GraphQL API 安全攻防指南
0x00 GraphQL 基础概念
GraphQL 简介
GraphQL 是由 Facebook 研发的 API 查询语言,旨在提高客户端和服务器之间的通信效率。与 REST API 相比,GraphQL 允许客户端明确指定其所需的数据,可用于精确查询数据。
Schema(模式)
Schema 是 GraphQL 中数据模型的定义,描述了客户端可以访问和操作的数据结构。主要包括三种操作类型:
- Query:查询操作(必选)
- Mutation:变更操作(可选)
- Subscription:订阅操作(可选)
示例 Schema:
type Book {
id: ID!
title: String!
author: String!
year: Int
}
type Query {
books: [Book!]!
bookById(id: ID: Book
}
type Mutation {
addBook(id: ID!, title: String!, author: String!, year: Int): Book!
}
type Subscription {
bookAdded: Book!
}
数据类型(Type)
GraphQL 类型分为:
- 标量类型(Scalar):String、Int、Float、Boolean、Enum、ID
- 对象类型(Object):自定义的复杂类型
- 其他类型:Interface、Union、Enum、Input
操作类型(Operations)
-
Query:用于从服务器查询数据
query { bookById(id: "1") { id title } } -
Mutation:用于修改服务器数据
mutation { addBook(title: "1984", author: "George Orwell") { id } } -
Subscription:用于实时数据推送
subscription { bookAdded { title } }
内省(Introspection)
GraphQL 的内置功能,用于查询服务端已定义好的 Schema 信息。常用查询:
-
查询所有类型
{ __schema { types { name } } } -
查询特定类型的字段
{ __type(name: "Book") { fields { name } } }
0x01 GraphQL 漏洞类型
1. 信息泄露(Information Disclosure)
- 内省查询:默认开启的内省功能可能泄露敏感信息
- GraphiQL 接口:开发接口可能暴露在
/graphiql、/playground等路径 - 错误信息:详细的错误信息可能泄露系统内部结构
2. 拒绝服务(Denial of Service)
- 批量查询攻击:单次请求中包含大量查询
- 深度递归查询:利用类型间的循环引用
query { pastes { owner { pastes { owner { pastes { ... } } } } } } - 字段重复攻击:重复大量字段
- 别名攻击:利用别名发送大量请求
query { alias1: book(id:1) { title } alias2: book(id:2) { title } ... alias100: book(id:100) { title } }
3. 注入漏洞
- SQL 注入:未过滤的用户输入直接拼接至数据库查询
- XSS:未过滤的用户输入返回至前端
- 日志欺骗:通过操作名称误导管理员
mutation GetUser { updateUser(name:"admin", pass:"123456") { id } }
4. 授权绕过
- JWT 伪造:修改 JWT 中的身份信息
- 接口保护绕过:修改 Cookie 或 Header
- 查询黑名单绕过:通过添加操作名称或特殊字符绕过
5. CSRF 攻击
当 GraphQL 端点支持 x-www-form-urlencoded 格式且无 CSRF 防护时可能被利用。
0x02 攻击方法论
1. 探测 GraphQL 端点
常见端点路径:
/graphql
/graphiql
/playground
/v1/graphql
/gql
2. 信息收集
-
内省查询:
query {__schema{queryType{name}mutationType{name}types{...FullType}}}fragment FullType on __Type{kind name fields{name type{name}}} -
可视化工具:
- 使用 graphql-voyager 可视化 Schema
-
自动化工具:
- Clairvoyance(当内省被禁用时)
pip install clairvoyance clairvoyance https://target.com/graphql -o schema.json
3. 绕过防护
-
内省查询绕过:
- 添加特殊字符(空格、换行、注释)
- 修改请求方法(GET/POST)
- 修改 Content-Type(application/json / x-www-form-urlencoded)
-
暴力破解绕过:
- 使用别名(Aliases)在单次请求中发送多个查询
query { user1:user(id:1) { password } user2:user(id:2) { password } }
4. 漏洞利用
根据收集到的信息构造特定攻击:
- 敏感数据查询
- 未授权操作
- 注入攻击
0x03 实战案例
案例1:私有数据访问
- 通过内省查询获取 Schema
- 可视化分析数据关系
- 构造查询获取私有数据
案例2:内省防护绕过
- 发现内省查询被过滤
- 使用换行符绕过:
query { __schema { types { name } } }
案例3:暴力破解防护绕过
- 发现直接暴力破解被限制
- 使用别名技术:
query { attempt1:login(user:"admin",pass:"123456") { token } attempt2:login(user:"admin",pass:"password") { token } }
0x04 防御措施
- 禁用内省:生产环境应禁用内省功能
- 查询限制:
- 限制查询深度
- 限制查询复杂度
- 设置查询超时
- 输入验证:对所有输入进行严格验证
- 权限控制:实施严格的权限控制
- 日志监控:记录和监控可疑查询
- 速率限制:防止暴力破解
0x05 工具推荐
-
测试工具:
- GraphiQL
- Altair
- Insomnia
-
安全工具:
- Inql(BurpSuite 插件)
- Clairvoyance
- GraphQL Cop
-
可视化工具:
- GraphQL Voyager
- GraphQL Editor
0x06 学习资源
-
官方文档:
-
靶场环境:
-
参考资源: