代码审计:PbootCMS2.07内核处理缺陷导致的一个前台任意文件包含漏洞分析
字数 1227 2025-08-25 22:58:40

PbootCMS 2.07 前台任意文件包含漏洞分析报告

漏洞概述

PbootCMS 2.07 版本存在一个由于内核处理缺陷导致的前台任意文件包含漏洞,攻击者可以通过精心构造的请求实现任意文件读取和包含,可能导致敏感信息泄露或远程代码执行。

漏洞原理分析

核心问题点

漏洞位于 PbootCMS 内核的模板解析函数 parser() 中,该函数存在以下关键缺陷:

  1. 路径过滤不充分

    $theme = preg_replace('/\.\.(\/|\\\)/', '', $theme); // 过滤掉相对路径
    $file = preg_replace('/\.\.(\/|\\\)/', '', $file); // 过滤掉相对路径
    

    仅对路径中的 ../..\ 进行了一次替换,可以通过双写绕过(如 ....//)。

  2. 文件包含逻辑

    • 当模板文件不在缓存中时,系统会读取 $tpl_file 内容并写入缓存文件
    • 最终通过 include 包含编译后的缓存文件

攻击链

完整的攻击链如下:

TagController -> parser() -> 双写绕过路径过滤 -> 文件读取 -> 文件写入 -> 文件包含

漏洞利用细节

触发点

漏洞通过 TagControllerindex() 方法触发:

public function index() {
    // ...
    $tagstpl = request('tagstpl');
    if (! preg_match('/^[\w\-\.\/]+$/', $tagstpl)) {
        $tagstpl = 'tags.html';
    }
    $content = parent::parser($this->htmldir . $tagstpl); // 漏洞触发点
    // ...
}

利用条件

  1. 攻击者可以控制 tagstpl 参数
  2. 系统未启用模板缓存或缓存文件不存在

利用方法

  1. 构造恶意路径

    • 使用双写绕过过滤:....//....//....//etc/passwd
    • 实际路径会变为:../../../etc/passwd
  2. 文件包含验证

    • 读取系统文件:/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版本)

  1. 修改正则表达式

    • 旧版:/^[\w\-\.\/]+$/
    • 新版:强制限制后缀名为 .html
  2. 新增过滤函数

    • 添加了 preg_replace_r() 函数进行循环替换

修复不足

官方修复仅针对 TagController 的正则进行了修改,未对内核中的路径过滤逻辑进行根本性修复,理论上其他可控 parser() 调用的地方仍可能存在风险。

安全建议

  1. 升级到最新版本:确保使用 PbootCMS 2.08 或更高版本
  2. 全面检查:检查所有调用 parser() 方法的地方,确保参数可控性
  3. 增强过滤
    • 实现多层路径过滤
    • 使用 realpath() 函数解析最终路径
    • 限制包含文件的后缀名
  4. 权限控制:限制 Web 服务器对系统文件的读取权限

漏洞影响

  • 影响版本:PbootCMS ≤ 2.07
  • 危害等级:高危
  • 潜在影响
    • 敏感信息泄露
    • 远程代码执行
    • 系统完全沦陷

总结

该漏洞展示了路径过滤不充分可能导致的严重后果,提醒开发者在文件操作相关功能中必须实施严格的安全措施。虽然官方已发布修复,但修复方案并不彻底,开发者应自行检查其他可能的攻击面。

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