报告时间: 2025年9月18日
CVE 分配时间: 2025年10月9日
发布时间: 2026年2月2日
CVE ID: CVE-2025-61505
发现者: Anas Abderrahman Benbarek
在 e107 CMS 2.3.3 版本的安装脚本(install.php)中发现了一个 PHP 对象注入漏洞(CWE-502:不可信数据的反序列化)。
该漏洞允许未认证的远程攻击者构造恶意的序列化数据,进而可能导致任意代码执行、数据篡改或其他恶意操作——具体取决于 e107 代码库或其依赖项中是否存在可利用的 gadget 类。
该问题源于对用户可控输入不安全地使用 PHP 的 unserialize() 函数,且没有任何限制(例如 allowed_classes 选项)。虽然该问题仅限于安装阶段,但在暴露的服务器上进行部署时仍会构成重大风险,因为安装程序会处理数据库创建和文件写入等敏感操作。
install.php)e107 CMS 的安装过程是多阶段的。用户输入(语言、数据库凭据、管理员详细信息等)通过存储在 previous_steps POST 参数中的序列化数组在各个步骤之间持久化。这些数据经 base64 编码后进行传输,并在服务器端解码/反序列化。
核心问题在于将解码后的用户输入直接传递给 unserialize(),而没有任何验证、清理或类白名单限制。这发生在两个位置:
php if(isset($_POST['previous_steps'])) { $tmp = unserialize(base64_decode($_POST['previous_steps'])); $override = (isset($tmp['paths']) && isset($tmp['paths']['hash'])) ? array('site_path'=>$tmp['paths']['hash']) : array(); unset($tmp); }
该脚本假定 previous_steps 包含来自先前表单步骤的可信序列化数据。但由于它只是一个普通的 POST 参数,攻击者可以完全控制它。base64_decode() 将输入转换为二进制数据,unserialize() 将其重建为 PHP 对象或数组。如果输入包含对象表示法(以 O: 开头),PHP 会实例化当前作用域中存在或自动加载的类。这会立即触发 __wakeup() 或其他魔术方法,如果存在 gadget 链,则可能导致文件写入或意外的数据库调用等副作用。 可利用性说明:能否成功利用取决于可用的 gadget 类。若缺少这些类,影响可能仅限于崩溃或数据损坏。
PHPif(isset($_POST['previous_steps'])) { $this->previous_steps = unserialize(base64_decode($_POST['previous_steps'])); // ... (filtering and password restoration logic) unset($_POST['previous_steps']); }
这个实例更加危险,因为反序列化的数据会成为对象状态($this->previous_steps)的一部分,并影响后续的安装程序操作(MySQL 设置、管理员创建、配置文件生成)。此处的对象注入可以在整个安装过程中持续存在,并影响高权限操作。同样,由于没有 allowed_classes 限制,任何自动加载的类(核心、处理器、插件、库)都可能被实例化。 可利用性说明:实际利用通常需要串联多个对象(即“gadget 链”)才能达到代码执行等危险行为。例如,某个类的 __wakeup() 可以调用另一个方法来评估用户控制的字符串。如果没有此类链,影响可能仅限于拒绝服务(例如,析构函数中的资源耗尽)。安装程序的高权限上下文(写入 e107_config.php、创建目录)会放大风险,但在安装后删除脚本可减少长期暴露。 该漏洞可在任何安装阶段通过向 /install.php 发送未认证的 HTTP POST 请求来触发。
unserialize($data, ['allowed_classes' => false]);
为数据添加 HMAC 签名/验证以增强完整性。
e107 CMS 官方网站:https://e107.org e107 CMS GitHub 仓库:https://github.com/e107inc/e107 CVE 记录:CVE-2025-61505(发布后将更新) CWE-502:不可信数据的反序列化:https://cwe.mitre.org/data/definitions/502.html