某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名称

漏洞原理

  1. 系统使用AUTH_KEY生成认证cookie
  2. cookie构造方式:$user_login(用户名) + $expiration(过期时间) + $hash(由AUTH_KEY生成)
  3. 如果两个系统的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必须相同

利用方法

  1. 在一个系统上获取合法用户的cookie
  2. 在另一个使用相同AUTH_KEY的系统上使用该cookie实现越权登录

后台Getshell方法

方法一:通过备份恢复修改上传后缀

步骤

  1. 后台有设置上传附件后缀的功能,但直接添加php后缀会被替换为X
  2. 通过备份功能获取数据库备份
  3. 在备份文件中找到设置上传后缀的SQL语句,添加php后缀
  4. 恢复修改后的备份文件
  5. 此时上传设置中已包含php后缀
  6. 通过文章发表功能上传PHP文件实现Getshell

关键代码

// 过滤上传后缀
if (strpos($ext, 'php') !== false) {
    $ext = str_replace('php', 'X', $ext);
}

方法二:通过插件上传ZIP文件

步骤

  1. 后台提供插件上传功能,接受ZIP格式
  2. 构造包含恶意PHP文件的ZIP包:
    • 创建一个文件夹(如a)
    • 在文件夹内创建同名PHP文件(a.php)
  3. 上传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

其他潜在攻击面

  1. 文件上传绕过

    • 虽然过滤了php,但未过滤asp(在IIS环境下可利用)
    • 未过滤phtml等可被解析的后缀
  2. 安全建议

    • 上传功能应严格限制允许的后缀
    • 不应允许用户修改上传白名单
    • 插件上传应进行更严格的内容检查

总结

  1. 漏洞链

    • 利用安装漏洞保持系统可重装状态
    • 通过越权漏洞获取后台访问权限
    • 使用两种不同方法实现Getshell
  2. 根本原因

    • 关键配置项(如AUTH_KEY)未做到系统唯一
    • 用户输入验证不充分
    • 权限控制不严格
  3. 修复建议

    • 安装完成后强制删除安装文件
    • 为每个系统生成唯一的AUTH_KEY
    • 严格限制上传文件类型
    • 对插件上传进行更严格的内容验证

参考

某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实现越权访问 代码追踪 : 利用条件 : 需要知道目标系统的 AUTH_KEY 两个系统的 AUTH_KEY 必须相同 利用方法 : 在一个系统上获取合法用户的cookie 在另一个使用相同 AUTH_KEY 的系统上使用该cookie实现越权登录 后台Getshell方法 方法一:通过备份恢复修改上传后缀 步骤 : 后台有设置上传附件后缀的功能,但直接添加php后缀会被替换为X 通过备份功能获取数据库备份 在备份文件中找到设置上传后缀的SQL语句,添加php后缀 恢复修改后的备份文件 此时上传设置中已包含php后缀 通过文章发表功能上传PHP文件实现Getshell 关键代码 : 方法二:通过插件上传ZIP文件 步骤 : 后台提供插件上传功能,接受ZIP格式 构造包含恶意PHP文件的ZIP包: 创建一个文件夹(如a) 在文件夹内创建同名PHP文件(a.php) 上传ZIP包后,系统会解压到 /content/plugins/a/a.php 代码分析 : 构造要求 : ZIP包必须包含一个文件夹 文件夹内必须有与文件夹同名的PHP文件 最终路径为: /content/plugins/[文件夹名]/[文件夹名].php 其他潜在攻击面 文件上传绕过 : 虽然过滤了php,但未过滤asp(在IIS环境下可利用) 未过滤phtml等可被解析的后缀 安全建议 : 上传功能应严格限制允许的后缀 不应允许用户修改上传白名单 插件上传应进行更严格的内容检查 总结 漏洞链 : 利用安装漏洞保持系统可重装状态 通过越权漏洞获取后台访问权限 使用两种不同方法实现Getshell 根本原因 : 关键配置项(如AUTH_ KEY)未做到系统唯一 用户输入验证不充分 权限控制不严格 修复建议 : 安装完成后强制删除安装文件 为每个系统生成唯一的AUTH_ KEY 严格限制上传文件类型 对插件上传进行更严格的内容验证 参考 HMAC算法原理 ZipArchive类文档 PHP文件上传安全最佳实践