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;
    }
}

漏洞原理:

  1. 系统通过$_a参数动态加载控制器类
  2. file_exists()函数检查控制器文件是否存在
  3. 使用eval()函数动态实例化控制器类
  4. 攻击者可以通过目录遍历技巧绕过file_exists()检查

绕过技巧:

  • file_exists()函数允许目录中存在特殊字符
  • /../会将前面的内容当作目录处理,并返回上级目录
  • 构造如Factory();phpinfo()的payload:
    • Factory用于闭合前面的实例化对象
    • phpinfo()是插入的恶意代码
    • 最后返回上级目录满足目录存在检查

触发点:

  • config/run.inc.php文件包含以下代码:
    Factory::setAction()->run();
    

可利用入口点:

  1. /admin/index.php (可简化为/admin)
  2. /search/index.php (可简化为/search)
  3. /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');
        // 其他密码修改逻辑...
    }
}

漏洞原理:

  1. 密码修改功能未进行充分的权限验证
  2. 仅检查了用户名是否为空,未验证当前会话权限
  3. 攻击者可以直接提交修改请求更改管理员密码

3. 漏洞复现步骤

3.1 RCE漏洞复现

  1. 访问以下URL之一:
    http://target/admin?a=Factory();phpinfo()
    http://target/search?a=Factory();phpinfo()
    http://target/config/count.php?a=Factory();phpinfo()
    
  2. 观察是否执行了phpinfo()函数

3.2 未授权密码修改复现

  1. 构造POST请求到?a=admin&m=update
  2. 提交包含管理员用户名和新密码的表单
  3. 观察密码是否被修改

4. 修复建议

4.1 RCE漏洞修复

  1. 修改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 未授权密码修改修复

  1. 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存在两个严重安全漏洞:

  1. 远程代码执行漏洞:由于不安全的动态类加载和eval使用导致
  2. 未授权管理员密码修改:由于缺乏权限验证导致

建议用户立即升级或应用修复补丁,避免系统被攻击者利用。

YCCMS V3.4 安全审计报告与漏洞分析 1. 系统概述 YCCMS V3.4 是一个基于PHP开发的内容管理系统,版本号为"Ver 3.4"。该系统采用单入口设计模式,通过Factory类动态加载控制器。 2. 漏洞分析 2.1 远程代码执行漏洞(RCE) 漏洞文件 : /public/class/Factory.class.php 漏洞代码 : 漏洞原理 : 系统通过 $_a 参数动态加载控制器类 file_exists() 函数检查控制器文件是否存在 使用 eval() 函数动态实例化控制器类 攻击者可以通过目录遍历技巧绕过 file_exists() 检查 绕过技巧 : file_exists() 函数允许目录中存在特殊字符 /../ 会将前面的内容当作目录处理,并返回上级目录 构造如 Factory();phpinfo() 的payload: Factory 用于闭合前面的实例化对象 phpinfo() 是插入的恶意代码 最后返回上级目录满足目录存在检查 触发点 : config/run.inc.php 文件包含以下代码: 可利用入口点 : /admin/index.php (可简化为 /admin ) /search/index.php (可简化为 /search ) /config/count.php 有效攻击向量 : 无效攻击向量 : 2.2 未授权管理员密码修改漏洞 漏洞文件 : controller/AdminAction.class.php 漏洞代码 : 漏洞原理 : 密码修改功能未进行充分的权限验证 仅检查了用户名是否为空,未验证当前会话权限 攻击者可以直接提交修改请求更改管理员密码 3. 漏洞复现步骤 3.1 RCE漏洞复现 访问以下URL之一: 观察是否执行了 phpinfo() 函数 3.2 未授权密码修改复现 构造POST请求到 ?a=admin&m=update 提交包含管理员用户名和新密码的表单 观察密码是否被修改 4. 修复建议 4.1 RCE漏洞修复 修改 Factory.class.php 中的 setAction 方法: 4.2 未授权密码修改修复 在 update 方法中添加权限验证: 5. 总结 YCCMS V3.4存在两个严重安全漏洞: 远程代码执行漏洞:由于不安全的动态类加载和eval使用导致 未授权管理员密码修改:由于缺乏权限验证导致 建议用户立即升级或应用修复补丁,避免系统被攻击者利用。