CVE-2026-33534
EspoCRM has authenticated SSRF via internal-host validation bypass using alternative IPv4 notation
Record summary
CVE-2026-33534 has a selected CVSS score of 4.3 (medium); EIP currently links 1 catalogued exploit, 1 repository PoC, and 1 Nuclei template.
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.
Exploitation context
Affected products and versions
1| Product | Source | Version range | Status |
|---|---|---|---|
espocrmBrowse espocrm / espocrm | CVE List | < 9.3.4 | affected |
Proofs of concept
2Catalogued exploits
ExploitDBEspoCRM 9.3.3 - SSRFExploitDB exploitby Max GabrielExploit1 file
Analysis
Technical assessment
Python script that authenticates to EspoCRM and exploits CVE-2026-33534 by sending SSRF requests to the /api/v1/Attachment/fromImageUrl endpoint using alternative IPv4 loopback representations to bypass internal host validation, then stores the fetched response as an attachment.
Backdoor review
No backdoor observed in reviewed code
The PoC is a straightforward Python script that demonstrates the CVE-2026-33534 SSRF vulnerability by sending authenticated HTTP requests to the EspoCRM /api/v1/Attachment/fromImageUrl endpoint with various loopback IP representations. It performs no persistence, credential exfiltration, unrelated remote access, or concealed payload delivery. All behavior is consistent with a legitimate vulnerability verification tool.
Classification basis and observed behavior
Classification basis
The script actively sends crafted requests to the vulnerable endpoint to trigger the SSRF vulnerability and create attachments on the server, which constitutes exploitation rather than mere detection or scanning.
exploits/multiple/webapps/52583.py:119-130exploits/multiple/webapps/52583.py:234-244exploits/multiple/webapps/52583.py:264-266Requirements
- Valid EspoCRM credentials
exploits/multiple/webapps/52583.py:183-184 - Target EspoCRM instance URL
exploits/multiple/webapps/52583.py:182
Observed behavior
- Authenticates to EspoCRM using provided credentials
exploits/multiple/webapps/52583.py:208-209 - Sends a control request to the fromImageUrl endpoint with 127.0.0.1 to verify blocking
exploits/multiple/webapps/52583.py:217-225 - Iterates through a list of alternative IPv4 loopback representations (octal, hex, decimal dword, etc.)
exploits/multiple/webapps/52583.py:26-38 - For each payload, sends a POST request to /api/v1/Attachment/fromImageUrl with the encoded loopback URL
exploits/multiple/webapps/52583.py:234-244 - Checks if the response indicates a successful bypass (HTTP 200 with an attachment id)
exploits/multiple/webapps/52583.py:155-162 - Optionally deletes created attachments for cleanup
exploits/multiple/webapps/52583.py:251-255
Behaviors behind the backdoor verdict
Observables
- Credential Handling
- Payload withheldCredentials are used solely for authentication to the user-supplied target URL; no exfiltration to third parties is present.
exploits/multiple/webapps/52583.py:183-184exploits/multiple/webapps/52583.py:208-209 - Network Activity
- Payload withheldAll network requests are directed at the user-provided target URL; no external or unrelated hosts are contacted.
exploits/multiple/webapps/52583.py:119-130exploits/multiple/webapps/52583.py:149-152exploits/multiple/webapps/52583.py:234-244 - Payload Behavior
- Payload withheldThe payloads are designed to bypass internal-host validation; they are not used to download or execute arbitrary code.
exploits/multiple/webapps/52583.py:26-38exploits/multiple/webapps/52583.py:234-244
What the analysis did not establish
- Only the Python script content was analyzed; no external dependencies or runtime behavior were inspected.
- The script's actual effectiveness depends on the target's configuration and patch status, which cannot be verified from static analysis alone.
- Only the single Python file (52583.py) was reviewed; no external dependencies beyond the standard library and the 'requests' module are inspected, but the script does not fetch or execute remote code.
- Binary content is not present in this artifact.
This review is limited to the supplied PoC code and context. It does not assert that the code works or is safe to execute.
Repository PoCs
GitHubEntroVyx/CVE-2026-33534Repository PoCby EntroVyxStars: 0Exploit4 files
Analysis
Technical assessment
Python script that authenticates to EspoCRM, sends SSRF payloads using alternative IPv4 loopback representations to the /api/v1/Attachment/fromImageUrl endpoint, and confirms vulnerability by checking for stored attachments.
Backdoor review
No backdoor observed in reviewed code
The supplied evidence consists of a Python exploit script and a README for CVE-2026-33534, an authenticated SSRF vulnerability in EspoCRM. The script sends HTTP requests to a target EspoCRM instance using provided credentials, tests various alternative IPv4 loopback representations to bypass internal host validation, and optionally cleans up created attachments. All behavior is consistent with a legitimate proof-of-concept for the described vulnerability. No concealed executable behavior, credential exfiltration, persistence mechanisms, or unrelated payloads were observed.
Classification basis and observed behavior
Classification basis
The script actively sends crafted requests to exploit the SSRF vulnerability by making the server fetch internal resources and store the response as an attachment. It does not merely detect or report the vulnerability; it exercises it to produce a tangible effect (stored attachment).
CVE-2026-33534.py:3CVE-2026-33534.py:119-130CVE-2026-33534.py:234-244CVE-2026-33534.py:155-162Requirements
- Valid EspoCRM credentials with permission to use the target image/attachment field
README.md:22-24 - Python 3 with requests library installed
README.md:21-22
Observed behavior
- Authenticates to EspoCRM using provided username and password
CVE-2026-33534.py:208-209 - Sends a control request with direct loopback IP 127.0.0.1 to verify blocking
CVE-2026-33534.py:217-225 - Iterates through alternative IPv4 loopback representations (octal, hex, decimal) and sends each as the image URL to the fromImageUrl API endpoint
CVE-2026-33534.py:234-244 - Checks if the server returned HTTP 200 with an attachment ID, indicating successful SSRF and stored attachment
CVE-2026-33534.py:155-162 - Optionally deletes created attachments after successful exploitation
CVE-2026-33534.py:251-255
Behaviors behind the backdoor verdict
Observables
- Url
- Payload withheldAdvisory URL referenced in the exploit script and README, consistent with the CVE description.
CVE-2026-33534.py:10README.md:15 - Url
- Payload withheldVendor homepage referenced in the exploit script header.
CVE-2026-33534.py:6 - Url
- Payload withheldSoftware link referenced in the exploit script header.
CVE-2026-33534.py:7 - Url
- Payload withheldExploit author's GitHub profile referenced in the script header.
CVE-2026-33534.py:5
What the analysis did not establish
- Evidence includes only two of four repository files; two files (likely LICENSE and .gitignore) are omitted from text content.
- The artifact's behavior is inferred from static code analysis; the code was not executed, and its effectiveness against a live target is not verified.
- Two additional files in the repository (total 4 files, 2 omitted) were not included in the text evidence; their content is unknown.
- The analysis is limited to static review of the provided source code; no dynamic execution or binary analysis was performed.
This review is limited to the supplied PoC code and context. It does not assert that the code works or is safe to execute.
Nuclei templates
1ProjectDiscoveryMEDIUMEspoCRM <= 9.3.3 - Server-Side Request ForgeryCVSS 4.3
EspoCRM <= 9.3.3 contains an authenticated server-side request forgery caused by improper internal-host validation using alternative IPv4 formats in HostCheck::isNotInternalHost(), letting authenticated users access internal resources via /api/v1/Attachment/fromImageUrl endpoint.
Impact
Authenticated attackers can access internal network resources, potentially exposing sensitive data or internal services.
Remediation
Upgrade to version 9.3.4 or later.
Source: ProjectDiscovery