Chamilo LMS Unauthenticated install.ajax.php SSRF + Open Mail Relay — CVE-2026-33715
by romain-deperne · 2026-07-05
- Severity
- High
- CVE
- CVE-2026-33715 / GHSA-mxc9-9335-45mc
- Category
- web
- Affected product
- Chamilo LMS 2.0
- Affected versions
- commit 0195b29 and earlier
- Disclosed
- 2026-07-05
- Patch status
- unpatched
Tags
Archive entry
intelseclab/poc-archiveMetadata
| Field | Value |
|---|---|
| Date Added | 2026-07-05 |
| Last Updated | 2026-04 |
| Author / Researcher | romain-deperne |
| CVE / Advisory | CVE-2026-33715 / GHSA-mxc9-9335-45mc |
| Category | web |
| Severity | High |
| CVSS Score | 7.5 |
| Status | PoC |
| Tags | ssrf, chamilo-lms, open-relay, unauthenticated, php, symfony-mailer, cwe-918, cwe-306, ajax-endpoint |
| Related | N/A |
Affected Target
| Field | Value |
|---|---|
| Software / System | Chamilo LMS 2.0 |
| Versions Affected | commit 0195b29 and earlier |
| Language / Platform | PHP (Symfony-based), exploited via Python/curl PoC |
| Authentication Required | No |
| Network Access Required | Yes |
Summary
Chamilo LMS ships an installation-wizard AJAX endpoint, public/main/inc/ajax/install.ajax.php, that unlike every other AJAX endpoint in the codebase never includes global.inc.php — the file responsible for enforcing session/authentication checks — and remains reachable on fully-installed, production instances. Its test_mailer action takes an attacker-supplied Symfony Mailer DSN string and destination address directly from POST data and passes the DSN straight to Transport::fromDsn(), then sends a real email through it. Because Apache serves existing .php files directly (bypassing Symfony’s front controller/security firewall for this file), any unauthenticated attacker can force the server to open an SMTP connection to an arbitrary internal or external host of their choosing and send attacker-controlled email content through it — a combined SSRF and open-relay primitive. The included poc.py demonstrates both effects against a target instance.
Vulnerability Details
Root Cause
install.ajax.php omits the require_once __DIR__.'/../global.inc.php' inclusion that every sibling AJAX endpoint uses to enforce authentication, and Apache’s rewrite rules pass existing .php files straight through to PHP, bypassing Symfony’s security firewall entirely for this file; its test_mailer action then feeds raw POST-supplied mailerDsn and mailerTestDestination values into Transport::fromDsn() and Mailer::send() with no validation.
Attack Vector
- Attacker identifies a Chamilo LMS 2.0 instance reachable over HTTP.
- Attacker sends an unauthenticated
POSTto/main/inc/ajax/install.ajax.php?a=test_mailerwith amailerDsnparameter pointing at an internal host/port (e.g.smtp://10.0.0.1:25) and arbitrary from/to address fields. - The server calls
Transport::fromDsn($mailerDsn)and connects to the attacker-chosen host/port — an SSRF primitive usable for internal network reconnaissance. - By pointing the DSN at a real reachable SMTP relay instead, the attacker causes Chamilo to send an actual email with attacker-controlled from/to/content, abusing the server as an open relay (e.g. for phishing appearing to originate from the victim organization’s mail infrastructure).
Impact
Unauthenticated SSRF against internal hosts/services plus the ability to send arbitrary emails through the victim server as an open relay, damaging its sender reputation and enabling phishing that appears to originate from a trusted domain; SMTP error responses can also leak internal network topology.
Environment / Lab Setup
Target: Chamilo LMS 2.0 (commit 0195b29 or earlier), fully installed instance, reachable over HTTP
Attacker: Python 3 (poc.py) or curl, network path to target and to an internal/attacker-controlled SMTP listener
Proof of Concept
PoC Script
See
poc.pyin this folder.
| |
poc.py automates sending the crafted unauthenticated POST request(s) to install.ajax.php?a=test_mailer against a target, demonstrating both the SSRF connection to an internal host and the open-relay email-send behavior described above.
Detection & Indicators of Compromise
POST /main/inc/ajax/install.ajax.php?a=test_mailer 200 (no session cookie)
Signs of compromise:
- Any request to
install.ajax.phpon an instance that has already completed installation, especially without an authenticated session. - Outbound SMTP connection attempts from the Chamilo web server to unexpected internal IPs/ports.
- Emails observed as sent “from” the Chamilo server’s mail infrastructure that do not correspond to legitimate application notification flows.
Remediation
| Action | Detail |
|---|---|
| Primary fix | No vendor patch confirmed as of 2026-07-05 — monitor Chamilo/GHSA-mxc9-9335-45mc for an official fix; restrict or remove install.ajax.php on completed installations. |
| Interim mitigation | Block/deny access to public/main/inc/ajax/install.ajax.php at the web server or reverse proxy level once installation is complete, and add it to global.inc.php-style auth enforcement or a WAF rule blocking unauthenticated test_mailer requests. |
References
Notes
Mirrored from https://github.com/romain-deperne/CVE-2026-33715 on 2026-07-05.
| |