GraphQL API 漏洞简介
- 一、漏洞原理与分类
 - 二、漏洞检测方法
 - 三、典型利用方式
 - 四、工具推荐
 - 防御建议
 
GraphQL API 因其灵活性和高效性被广泛应用,但也因设计和实现缺陷存在多种安全风险。以下从漏洞原理、检测方法及利用方式三个维度进行详细分析:
一、漏洞原理与分类
-  
内省查询漏洞
GraphQL 默认启用内省(Introspection)功能,允许通过__schema或__type查询获取完整的 API 模式信息,包括数据结构、字段参数等敏感内容。若未禁用此功能,攻击者可借此了解后端逻辑,为后续攻击提供情报。 -  
信息泄露与越权访问
- IDOR(不安全的直接对象引用):通过未过滤的参数(如 
id)直接访问未授权资源。例如,修改用户 ID 参数获取其他用户信息。 - 敏感字段暴露:内省查询可能泄露包含 
password、email等敏感字段的接口定义,攻击者可构造查询直接获取数据。 
 - IDOR(不安全的直接对象引用):通过未过滤的参数(如 
 -  
拒绝服务(DoS)攻击
- 深度嵌套查询:通过递归或多层嵌套结构(如 
user→posts→comments→user)消耗服务器资源。 - 重复字段查询:GraphQL 不会自动去重字段,攻击者可构造包含数千次重复字段的查询拖慢响应。
 
 - 深度嵌套查询:通过递归或多层嵌套结构(如 
 -  
注入类漏洞
- SQL/NoSQL 注入:参数未正确过滤时,攻击者可通过输入恶意参数触发数据库注入。
 - 命令执行:某些接口允许执行系统命令(如调试功能),未验证输入可能导致 RCE。
 
 -  
CSRF 与权限问题
- CSRF 攻击:若 GraphQL 接受 GET 请求或未校验 CSRF Token,攻击者可诱骗用户执行恶意操作(如修改密码)。
 - 权限控制缺失:业务层未校验用户权限,导致水平或垂直越权。
 
 
二、漏洞检测方法
-  
端点发现
- 常见路径探测:尝试 
/graphql、/api/graphql等标准路径,或附加/v1、/console等变体。 - 通用查询验证:发送 
query { __typename },若响应包含{"data": {"__typename": "query"}},则为 GraphQL 端点。 
 - 常见路径探测:尝试 
 -  
内省查询利用
构造完整内省查询(如query IntrospectionQuery)获取模式信息,使用工具(如 Voyager、InQL)可视化分析数据结构。 -  
参数探测与越权测试
- 参数遍历:修改 
id、username等参数,观察是否返回未授权数据。 - 批量请求测试:通过别名(Alias)绕过速率限制,尝试爆破弱密码或枚举资源。
 
 - 参数遍历:修改 
 -  
DoS 检测
- 嵌套深度测试:构造递归查询,观察服务器响应时间或错误提示。
 - 重复字段负载:在单次查询中重复请求同一字段数百次。
 
 -  
注入检测
- SQL 注入尝试:在参数中添加 
'、OR 1=1等字符,观察错误回显或异常行为。 - 命令注入探测:测试参数是否可拼接系统命令(如 
; whoami)。 
 - SQL 注入尝试:在参数中添加 
 
三、典型利用方式
-  
信息收集阶段
- 使用 
__schema获取全部类型和字段,识别敏感接口(如getUser、adminQuery)。 - 通过工具(如 GraphQLmap)自动化枚举并生成攻击载荷。
 
 - 使用 
 -  
数据越权获取
- 修改查询中的 
id参数,获取其他用户数据(如密码哈希)。 - 利用未鉴权的 Mutation 操作(如 
createUser)添加管理员账户。 
 - 修改查询中的 
 -  
DoS 攻击实施
- 发送深度嵌套查询(如循环引用 
User→Post→Comment→User)耗尽服务器资源。 - 批量发送高复杂度查询,触发服务器超时或崩溃。
 
 - 发送深度嵌套查询(如循环引用 
 -  
注入攻击
- 在参数中注入 SQL 语句,通过错误回显或盲注提取数据库信息。
 - 利用 
systemDiagnostics等接口执行系统命令。 
 -  
CSRF 利用
- 构造恶意页面,诱使用户触发 Mutation 操作(如修改邮箱或密码)。
 
 
四、工具推荐
- InQL:Burp Suite 插件,自动化内省查询与漏洞扫描。
 - GraphQLmap:专用于 GraphQL 注入与渗透测试的脚本引擎。
 - Voyager:可视化展示 GraphQL 模式,辅助分析数据结构。
 - Postman:支持 GraphQL 请求构造与变量测试。
 
防御建议
- 禁用内省功能:生产环境中关闭内省查询。
 - 请求限制:设置查询深度、复杂度阈值及速率限制。
 - 输入过滤与参数化查询:避免直接拼接用户输入。
 - 权限校验:在业务层实现细粒度访问控制,避免依赖前端过滤。
 
通过综合上述方法,可系统性地识别和防御 GraphQL API 的潜在风险。具体案例与工具使用可参考搜索结果中的实战分析。