ModStartCMS-7.2.0 代码审计
字数 1242 2025-08-18 11:36:48
ModStartCMS 7.2.0 Phar反序列化RCE漏洞分析与利用
漏洞概述
ModStartCMS 7.2.0版本存在一个通过Phar反序列化实现的远程代码执行(RCE)漏洞。该漏洞源于系统对文件上传的处理不当,攻击者可以通过构造特殊的Phar文件并触发其反序列化过程,最终实现任意代码执行。
前置知识
Phar文件格式
Phar(PHP Archive)是PHP的一种打包格式,包含以下四个部分:
- Stub - Phar文件的引导程序,通常是一个PHP代码片段
- Manifest - 包含文件的元数据,如文件权限、大小等
- File Contents - 实际的文件内容
- Signature - 可选的签名部分
反序列化攻击原理
当PHP代码使用file_exists()、is_dir()等文件系统函数操作Phar文件时,会自动反序列化Phar文件的metadata部分。如果metadata中包含恶意构造的序列化数据,就可能触发反序列化漏洞。
漏洞分析
漏洞触发点
ModStartCMS 7.2.0中,文件上传功能对用户上传的文件处理不当,允许上传Phar文件。当系统后续处理这些文件时,会触发Phar的反序列化过程。
关键代码分析
-
文件上传处理:
- 系统未对上传文件的类型进行严格过滤
- 允许上传.phar文件或可以修改文件内容为Phar格式
-
反序列化触发:
- 系统在处理上传文件时使用了
file_exists()、is_file()等函数 - 这些函数在操作Phar文件时会自动反序列化metadata
- 系统在处理上传文件时使用了
-
利用链构造:
- 系统中存在可被利用的魔术方法(如
__destruct()、__wakeup()) - 通过这些魔术方法可以构造出完整的利用链
- 系统中存在可被利用的魔术方法(如
漏洞利用
步骤1:构造恶意Phar文件
<?php
class Exploit {
// 这里定义恶意类,包含可利用的魔术方法
}
$phar = new Phar('exploit.phar');
$phar->startBuffering();
$phar->addFromString('test.txt', 'text');
$phar->setStub('<?php __HALT_COMPILER(); ?>');
// 构造恶意metadata
$object = new Exploit();
$phar->setMetadata($object);
$phar->stopBuffering();
?>
步骤2:上传Phar文件
- 通过系统文件上传接口上传构造的Phar文件
- 可能需要修改文件扩展名绕过简单过滤(如改为.jpg)
步骤3:触发反序列化
- 找到系统处理上传文件的代码路径
- 确保系统会使用文件系统函数操作上传的Phar文件
- 触发反序列化过程执行恶意代码
防御措施
-
禁用Phar流:
// 在php.ini中禁用phar流 phar.readonly = On -
严格文件类型检查:
- 使用MIME类型检查而非文件扩展名
- 实现文件内容验证
-
安全反序列化:
- 避免反序列化用户可控数据
- 使用白名单限制可反序列化的类
-
更新系统:
- 升级到ModStartCMS最新版本
- 应用官方安全补丁
扩展学习
-
Phar反序列化利用技巧:
- 多种文件系统函数触发方式
- 不同PHP版本下的差异
-
利用链构造:
- 分析常见PHP框架中的可利用类
- 魔术方法的利用方式
-
绕过技巧:
- 文件扩展名绕过
- 内容检测绕过
总结
ModStartCMS 7.2.0的Phar反序列化漏洞展示了文件上传功能与反序列化结合可能带来的严重安全问题。开发人员应重视文件上传的安全处理,并避免危险的反序列化操作。对于安全研究人员,理解Phar反序列化机制有助于发现和防御此类漏洞。