骑士CMS模版注入+文件包含getshell漏洞复现
字数 1017 2025-08-07 08:22:09

骑士CMS模版注入+文件包含漏洞分析与利用

漏洞概述

骑士CMS(版本号未明确)存在模版注入和文件包含漏洞,攻击者可以利用这些漏洞实现远程代码执行(RCE)和获取服务器权限。该CMS基于PHP+MySQL开发,使用ThinkPHP 3.2.3框架。

漏洞环境搭建

  1. 下载骑士CMS源码(建议使用存在漏洞的历史版本)
  2. 配置PHP环境(5.x或7.x均可)
  3. 配置MySQL数据库并导入SQL文件
  4. 完成安装流程

漏洞分析

1. 模版注入漏洞

漏洞位置

Application/Common/Controller/BaseController.class.php 文件中的 display 方法

漏洞原理

骑士CMS在处理模版渲染时,未对用户输入的模版路径进行严格过滤,导致攻击者可以控制模版文件路径,进而实现模版注入。

关键代码分析

public function display($templateFile='',$charset='',$contentType='',$content='',$prefix='') {
    if(empty($charset)) $charset = C('DEFAULT_CHARSET');
    if(empty($contentType)) $contentType = C('TMPL_CONTENT_TYPE');
    // 网页字符编码
    header('Content-Type:'.$contentType.'; charset='.$charset);
    header('Cache-control: private');  //支持页面回跳
    // 解析模版
    $content = $this->fetch($templateFile,$content,$prefix);
    // 输出编码后的内容
    $this->show($content,$contentType,$charset);
}

2. 文件包含漏洞

漏洞位置

Application/Common/Controller/BaseController.class.php 文件中的 fetch 方法

漏洞原理

系统在加载模版文件时,未对用户控制的参数进行过滤,导致可以包含任意文件(包括远程文件)。

关键代码分析

public function fetch($templateFile='',$content='',$prefix='') {
    if(empty($content)) {
        $templateFile   =   $this->parseTemplate($templateFile);
        // 模版文件不存在直接返回
        if(!is_file($templateFile)) E(L('_TEMPLATE_NOT_EXIST_').':'.$templateFile);
    }
    // 页面缓存
    ob_start();
    ob_implicit_flush(0);
    // 渲染模版
    if(!empty($content)) {
        // 直接解析内容
        $this->display($content,$charset,$contentType,$content,$prefix);
    } else {
        // 解析模版文件
        PHP_OS=='Linux' && $templateFile = str_replace('\\','/',$templateFile);
        include $templateFile;
    }
    // 获取并清空缓存
    $content = ob_get_clean();
    // 内容过滤
    if(C('OUTPUT_ENCODE')) {
        $content = $this->contentReplace($content);
    }
    // 输出编码后的内容
    return $content;
}

漏洞利用

模版注入利用步骤

  1. 登录后台(需要管理员权限)
  2. 访问模版管理功能
  3. 编辑模版文件,插入恶意PHP代码
  4. 通过特定URL触发模版渲染

文件包含利用步骤

  1. 构造恶意请求,控制templateFile参数
  2. 包含本地敏感文件(如/etc/passwd
  3. 或包含远程恶意PHP文件(需要allow_url_include开启)

组合利用实现RCE

  1. 通过文件包含漏洞包含一个可写的本地文件
  2. 写入PHP代码
  3. 再次包含该文件执行代码

示例Payload

http://target.com/index.php?m=Home&c=Index&a=index&templateFile=./Application/Runtime/Logs/Common/21_08_01.log

漏洞修复建议

  1. 对用户输入的模版路径进行严格过滤
  2. 禁用危险函数如include的动态包含
  3. 关闭allow_url_include选项
  4. 更新到最新版本(如果官方已修复)
  5. 对模版文件目录设置严格的权限控制

防御措施

  1. 实施输入验证和过滤
  2. 使用白名单机制限制可包含的文件
  3. 定期更新CMS系统和框架
  4. 部署WAF防护规则
  5. 限制服务器文件系统访问权限

参考链接

  • 骑士CMS官方网站
  • ThinkPHP 3.2.3官方文档
  • PHP安全配置指南

免责声明

本文仅用于安全研究和教育目的,未经授权不得用于非法渗透测试。在实际环境中测试漏洞前,请确保已获得系统所有者的明确授权。

骑士CMS模版注入+文件包含漏洞分析与利用 漏洞概述 骑士CMS(版本号未明确)存在模版注入和文件包含漏洞,攻击者可以利用这些漏洞实现远程代码执行(RCE)和获取服务器权限。该CMS基于PHP+MySQL开发,使用ThinkPHP 3.2.3框架。 漏洞环境搭建 下载骑士CMS源码(建议使用存在漏洞的历史版本) 配置PHP环境(5.x或7.x均可) 配置MySQL数据库并导入SQL文件 完成安装流程 漏洞分析 1. 模版注入漏洞 漏洞位置 Application/Common/Controller/BaseController.class.php 文件中的 display 方法 漏洞原理 骑士CMS在处理模版渲染时,未对用户输入的模版路径进行严格过滤,导致攻击者可以控制模版文件路径,进而实现模版注入。 关键代码分析 2. 文件包含漏洞 漏洞位置 Application/Common/Controller/BaseController.class.php 文件中的 fetch 方法 漏洞原理 系统在加载模版文件时,未对用户控制的参数进行过滤,导致可以包含任意文件(包括远程文件)。 关键代码分析 漏洞利用 模版注入利用步骤 登录后台(需要管理员权限) 访问模版管理功能 编辑模版文件,插入恶意PHP代码 通过特定URL触发模版渲染 文件包含利用步骤 构造恶意请求,控制 templateFile 参数 包含本地敏感文件(如 /etc/passwd ) 或包含远程恶意PHP文件(需要 allow_url_include 开启) 组合利用实现RCE 通过文件包含漏洞包含一个可写的本地文件 写入PHP代码 再次包含该文件执行代码 示例Payload 漏洞修复建议 对用户输入的模版路径进行严格过滤 禁用危险函数如 include 的动态包含 关闭 allow_url_include 选项 更新到最新版本(如果官方已修复) 对模版文件目录设置严格的权限控制 防御措施 实施输入验证和过滤 使用白名单机制限制可包含的文件 定期更新CMS系统和框架 部署WAF防护规则 限制服务器文件系统访问权限 参考链接 骑士CMS官方网站 ThinkPHP 3.2.3官方文档 PHP安全配置指南 免责声明 本文仅用于安全研究和教育目的,未经授权不得用于非法渗透测试。在实际环境中测试漏洞前,请确保已获得系统所有者的明确授权。