某logCMS的代码审计:越权到后台getshell
字数 1332 2025-08-26 22:11:39
某logCMS代码审计:从越权到后台Getshell的完整分析
前言
本文详细分析某logCMS存在的多个安全漏洞,包括安装漏洞、越权漏洞以及两种后台Getshell方法。通过黑盒与白盒结合的审计方法,揭示该CMS的安全缺陷。
代码审计
1. 安装漏洞
漏洞文件:install.php
问题分析:
- 系统默认设置
DEL_INSTALLER常量为0,导致无法自动删除install.php安装文件 - 虽然表单做了过滤防止直接写入恶意内容到config.php,但允许任意重装系统
验证方法:
- 直接访问install.php可触发重装流程
- 黑盒测试确认该漏洞存在
2. 越权漏洞
关键常量:
AUTH_KEY:认证密钥AUTH_COOKIE_NAME:认证cookie名称
漏洞原理:
- 系统使用
AUTH_KEY生成认证cookie - cookie构造方式:
$user_login(用户名) +$expiration(过期时间) +$hash(由AUTH_KEY生成) - 如果两个系统的
AUTH_KEY相同,则可通过复制cookie实现越权访问
代码追踪:
// 生成认证cookie
$hash = emHash($user_login . $expiration, AUTH_KEY);
$cookie = $user_login . '|' . $expiration . '|' . $hash;
// emHash函数实现
function emHash($data, $key) {
$key = md5($key, true); // 转换为二进制字符串
$ipad = str_repeat(chr(0x36), 64);
$opad = str_repeat(chr(0x5C), 64);
// ... 异或运算和哈希计算
return md5($pack);
}
利用条件:
- 需要知道目标系统的
AUTH_KEY - 两个系统的
AUTH_KEY必须相同
利用方法:
- 在一个系统上获取合法用户的cookie
- 在另一个使用相同
AUTH_KEY的系统上使用该cookie实现越权登录
后台Getshell方法
方法一:通过备份恢复修改上传后缀
步骤:
- 后台有设置上传附件后缀的功能,但直接添加php后缀会被替换为X
- 通过备份功能获取数据库备份
- 在备份文件中找到设置上传后缀的SQL语句,添加php后缀
- 恢复修改后的备份文件
- 此时上传设置中已包含php后缀
- 通过文章发表功能上传PHP文件实现Getshell
关键代码:
// 过滤上传后缀
if (strpos($ext, 'php') !== false) {
$ext = str_replace('php', 'X', $ext);
}
方法二:通过插件上传ZIP文件
步骤:
- 后台提供插件上传功能,接受ZIP格式
- 构造包含恶意PHP文件的ZIP包:
- 创建一个文件夹(如a)
- 在文件夹内创建同名PHP文件(a.php)
- 上传ZIP包后,系统会解压到
/content/plugins/a/a.php
代码分析:
// 插件解压函数
function emUnzip($zipfile, $path) {
$zip = new ZipArchive();
$zip->open($zipfile);
$dir = trim(dirname($zip->getNameIndex(0)), '/');
$plugin_name = $dir;
// 检查是否存在$dir/$plugin_name.php
if ($zip->getFromName($dir . '/' . $plugin_name . '.php')) {
// 解压到目标路径
$zip->extractTo($path);
}
}
构造要求:
- ZIP包必须包含一个文件夹
- 文件夹内必须有与文件夹同名的PHP文件
- 最终路径为:
/content/plugins/[文件夹名]/[文件夹名].php
其他潜在攻击面
-
文件上传绕过:
- 虽然过滤了php,但未过滤asp(在IIS环境下可利用)
- 未过滤phtml等可被解析的后缀
-
安全建议:
- 上传功能应严格限制允许的后缀
- 不应允许用户修改上传白名单
- 插件上传应进行更严格的内容检查
总结
-
漏洞链:
- 利用安装漏洞保持系统可重装状态
- 通过越权漏洞获取后台访问权限
- 使用两种不同方法实现Getshell
-
根本原因:
- 关键配置项(如AUTH_KEY)未做到系统唯一
- 用户输入验证不充分
- 权限控制不严格
-
修复建议:
- 安装完成后强制删除安装文件
- 为每个系统生成唯一的AUTH_KEY
- 严格限制上传文件类型
- 对插件上传进行更严格的内容验证
参考
- HMAC算法原理
- ZipArchive类文档
- PHP文件上传安全最佳实践