celeboy711-hue/CVE-2026-29041

GitHub: celeboy711-hue/CVE-2026-29041

针对 Chamilo LMS 1.11.32 的认证后文件上传漏洞 PoC,演示如何以学生低权限账户绕过 MIME 检测实现远程代码执行。

Stars: 0 | Forks: 0

# CVE-2026-29041 — Chamilo LMS 1.11.32 中经由无限制文件上传实现的认证后 RCE

## 📋 漏洞概要 ## | 字段 | 详情 | |--------------------|-------------------------------------------------------------------------| | **产品** | Chamilo LMS | | **版本** | 1.11.32 (已确认) | | **漏洞** | 无限制上传危险类型文件 (CWE-434) | | **影响** | 认证后远程代码执行 (RCE) | | **CVSS v3.1** | `8.8 (高危)` — `CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H` | | **需要认证** | ✅ 是 — 学生角色 (低权限) | | **CWE** | CWE-434: 无限制上传危险类型文件 | | **发现者** | MENG HOKSENG | ## 🧠 漏洞详情 ### 受影响端点 ``` POST /main/inc/ajax/document.ajax.php?a=ck_uploadimage&cidReq=[COURSE_ID] ``` **受影响文件:** `main/inc/ajax/document.ajax.php` **受影响函数:** `ck_uploadimage` ### 根本原因分析 上传处理程序**仅执行 MIME 类型验证**,使用的是 PHP 的 `mime_content_type()` 函数,该函数检查的是文件的**魔术字节**(内容的前几个字节),而非文件扩展名。 ``` // Vulnerable validation logic (simplified) $mime = mime_content_type($_FILES['upload']['tmp_name']); if (!mimeAccepted($mime, ['image'])) { die("Invalid file type"); } // ❌ No extension validation // ❌ No sanitization of filename move_uploaded_file($_FILES['upload']['tmp_name'], $uploadPath . $fileUploadName); ``` 两个独立的弱点结合在一起形成了完整的利用链: 1. **仅 MIME 类型验证** — 通过在 PHP 代码前添加有效的图片魔术字节 (`GIF89a`) 绕过 2. **保留原始文件名** — 服务器使用攻击者控制的文件名(包含 `.php` 扩展名)保存文件,且保存在一个**Web 可访问的目录**中 ### 绕过技术 恶意文件构造如下: ``` GIF89a; ``` - `mime_content_type()` 读取到 `GIF89a` → 识别为 `image/gif` → **通过验证** - `move_uploaded_file()` 将文件作为 `shell.php` 保存至 `/app/upload/users//` → **可通过浏览器直接执行** ## 💣 概念验证 (PoC) 运行完整的 exploit,以学生身份登录并自动执行文件上传 image 运行 Python 完整 exploit 后,我们可以在 http://localhost:8081/app/upload/users/3/3/my_fileszhxoxgwj.php?cmd=id 找到上传的 web shell image ## 🛡️ 影响 成功利用此漏洞可导致从学生级别账户实现**完全服务器沦陷**: - 🔴 **远程代码执行 (RCE)** — 通过 web shell 执行任意操作系统命令 - 🔴 **数据窃取** — 完全访问应用程序数据库凭据和文件 - 🔴 **横向移动** — 从沦陷服务器 pivoting 到内部网络 - 🔴 **持久化** — 能够在 Web 可访问目录中植入后门 - 🔴 **服务中断** — 修改或删除课程内容和用户数据 **CIA 影响:机密性、完整性和可用性的完全丧失。** ## 🔧 修复建议 ▪ **强制执行严格的文件扩展名白名单** 只应接受明确允许的图片文件扩展名(如 .jpg、.png、.gif)。 无论 MIME 类型如何,都必须拒绝上传带有可执行扩展名(如 .php、.phtml 或 .phar)的文件。 ▪ **不要仅依赖 MIME 类型验证** 不应将使用 mime_content_type() 等函数进行的 MIME 类型检查作为主要的安全控制措施,因为它们可以通过构造的文件头绕过。MIME 验证应仅作为辅助检查。 ▪ **将上传的文件存储在 Web 可访问目录之外** 上传的内容应存储在无法通过 Web 服务器直接访问的目录中。如果需要公开访问,应通过受控的处理程序提供文件服务,而非直接访问。 ## 📄 参考资料 - [Chamilo LMS 官方网站](https://chamilo.org) - [CWE-434: 无限制上传危险类型文件](https://cwe.mitre.org/data/definitions/434.html) - [OWASP: 无限制文件上传](https://owasp.org/www-community/vulnerabilities/Unrestricted_File_Upload) - [CVSS v3.1 计算器](https://www.first.org/cvss/calculator/3.1) ## 👤 作者 **MENG HOKSENG** 独立安全研究员 ## ⚠️ 法律免责声明 本项目仅用于**教育和授权安全研究目的**。作者不对因使用此 exploit 而导致的任何误用或损害负责。在进行安全评估之前,请务必获得明确的书面授权。
标签:Ajax文件上传, Chamilo LMS, CISA项目, CVE-2026-29041, CVSS 8.8, CWE-434, Magic Bytes, MIME类型验证绕过, PHP安全, RCE, Web安全, 任意文件上传, 协议分析, 学习管理系统, 提示词注入, 权限提升, 编程工具, 蓝队分析, 认证后漏洞, 远程代码执行, 逆向工具, 高危漏洞