从零开始 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 中数据模型的定义,描述了客户端可以访问和操作的数据结构。主要包括三种操作类型:

  1. Query:查询操作(必选)
  2. Mutation:变更操作(可选)
  3. 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 类型分为:

  1. 标量类型(Scalar):String、Int、Float、Boolean、Enum、ID
  2. 对象类型(Object):自定义的复杂类型
  3. 其他类型:Interface、Union、Enum、Input

操作类型(Operations)

  1. Query:用于从服务器查询数据

    query {
      bookById(id: "1") {
        id
        title
      }
    }
    
  2. Mutation:用于修改服务器数据

    mutation {
      addBook(title: "1984", author: "George Orwell") {
        id
      }
    }
    
  3. Subscription:用于实时数据推送

    subscription {
      bookAdded {
        title
      }
    }
    

内省(Introspection)

GraphQL 的内置功能,用于查询服务端已定义好的 Schema 信息。常用查询:

  1. 查询所有类型

    {
      __schema {
        types {
          name
        }
      }
    }
    
  2. 查询特定类型的字段

    {
      __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. 信息收集

  1. 内省查询

    query {__schema{queryType{name}mutationType{name}types{...FullType}}}fragment FullType on __Type{kind name fields{name type{name}}}
    
  2. 可视化工具

  3. 自动化工具

    • Clairvoyance(当内省被禁用时)
    pip install clairvoyance
    clairvoyance https://target.com/graphql -o schema.json
    

3. 绕过防护

  1. 内省查询绕过

    • 添加特殊字符(空格、换行、注释)
    • 修改请求方法(GET/POST)
    • 修改 Content-Type(application/json / x-www-form-urlencoded)
  2. 暴力破解绕过

    • 使用别名(Aliases)在单次请求中发送多个查询
    query {
      user1:user(id:1) { password }
      user2:user(id:2) { password }
    }
    

4. 漏洞利用

根据收集到的信息构造特定攻击:

  • 敏感数据查询
  • 未授权操作
  • 注入攻击

0x03 实战案例

案例1:私有数据访问

  1. 通过内省查询获取 Schema
  2. 可视化分析数据关系
  3. 构造查询获取私有数据

案例2:内省防护绕过

  1. 发现内省查询被过滤
  2. 使用换行符绕过:
    query {
      __schema
      {
        types { name }
      }
    }
    

案例3:暴力破解防护绕过

  1. 发现直接暴力破解被限制
  2. 使用别名技术:
    query {
      attempt1:login(user:"admin",pass:"123456") { token }
      attempt2:login(user:"admin",pass:"password") { token }
    }
    

0x04 防御措施

  1. 禁用内省:生产环境应禁用内省功能
  2. 查询限制
    • 限制查询深度
    • 限制查询复杂度
    • 设置查询超时
  3. 输入验证:对所有输入进行严格验证
  4. 权限控制:实施严格的权限控制
  5. 日志监控:记录和监控可疑查询
  6. 速率限制:防止暴力破解

0x05 工具推荐

  1. 测试工具

    • GraphiQL
    • Altair
    • Insomnia
  2. 安全工具

    • Inql(BurpSuite 插件)
    • Clairvoyance
    • GraphQL Cop
  3. 可视化工具

    • GraphQL Voyager
    • GraphQL Editor

0x06 学习资源

  1. 官方文档:

  2. 靶场环境:

  3. 参考资源:

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