骑士CMS模版注入+文件包含getshell漏洞复现
字数 1017 2025-08-07 08:22:09
骑士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在处理模版渲染时,未对用户输入的模版路径进行严格过滤,导致攻击者可以控制模版文件路径,进而实现模版注入。
关键代码分析
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;
}
漏洞利用
模版注入利用步骤
- 登录后台(需要管理员权限)
- 访问模版管理功能
- 编辑模版文件,插入恶意PHP代码
- 通过特定URL触发模版渲染
文件包含利用步骤
- 构造恶意请求,控制
templateFile参数 - 包含本地敏感文件(如
/etc/passwd) - 或包含远程恶意PHP文件(需要
allow_url_include开启)
组合利用实现RCE
- 通过文件包含漏洞包含一个可写的本地文件
- 写入PHP代码
- 再次包含该文件执行代码
示例Payload
http://target.com/index.php?m=Home&c=Index&a=index&templateFile=./Application/Runtime/Logs/Common/21_08_01.log
漏洞修复建议
- 对用户输入的模版路径进行严格过滤
- 禁用危险函数如
include的动态包含 - 关闭
allow_url_include选项 - 更新到最新版本(如果官方已修复)
- 对模版文件目录设置严格的权限控制
防御措施
- 实施输入验证和过滤
- 使用白名单机制限制可包含的文件
- 定期更新CMS系统和框架
- 部署WAF防护规则
- 限制服务器文件系统访问权限
参考链接
- 骑士CMS官方网站
- ThinkPHP 3.2.3官方文档
- PHP安全配置指南
免责声明
本文仅用于安全研究和教育目的,未经授权不得用于非法渗透测试。在实际环境中测试漏洞前,请确保已获得系统所有者的明确授权。