PbootCMS v2.0.7从前台数据库下载到后台RCE研究
前言
PbootCMS是全新内核且永久开源免费的PHP企业网站开发建设管理系统,是一套高效、简洁、 强悍的可免费商用的PHP CMS源码,能够满足各类企业网站开发建设的需要。
环境:
- Apache 2.4.39
- PHP 7.3.8
分析
该程序的特点是默认使用的sqlite
数据库
可以看看数据库的配置文件config/database.php
<?php
/**
* 主数据库连接参数,未配置的参数使用框架惯性配置
* 如果修改为mysql数据库,请同时修改type和dbname两个参数
*/
return array(
'database' => array(
'type' => 'sqlite', // 数据库连接驱动类型: mysqli,sqlite,pdo_mysql,pdo_sqlite
'host' => '127.0.0.1', // 数据库服务器
'user' => 'pboot', // 数据库连接用户名
'passwd' => '123456', // 数据库连接密码
'port' => '3306', // 数据库端口
// 'dbname' => 'pbootcms' // 去掉注释,启用mysql数据库,注意修改前面的连接信息及type为mysqli
'dbname' => '/data/pbootcms.db' // 去掉注释,启用Sqlite数据库,注意修改type为sqlite
)
);
默认的数据库路径是/data/pbootcms.db
,且data目录下没有进行任何的判断,后台也没有提供修改数据库路径的功能,所以可直接下载。
下载后用sqlite3
打开就可以得到用户的hash,hash使用的是md5(md5($pass))
生成的。
所以这里直接挖后台的洞
任意文件读取
漏洞文件apps/admin/controller/system/UpgradeController.php
<?php
...
public function update(){
if ($_POST) {
if (! ! $list = post('list')) {
$list = explode(',', $list);
$backdir = date('YmdHis');
// 分离文件
foreach ($list as $value) {
if (stripos($value, '/script/') !== false) {
$sqls[] = $value;
} else {
$path = RUN_PATH . '/upgrade' . $value;
$des_path = ROOT_PATH . $value;
$back_path = DOC_PATH . STATIC_DIR . '/backup/upgrade/' . $backdir . $value;
if (! check_dir(dirname($des_path), true)) {
json(0, '目录写入权限不足,无法正常升级!' . dirname($des_path));
}
if (file_exists($des_path)) { // 文件存在时执行备份
check_dir(dirname($back_path), true);
copy($des_path, $back_path);
}
// 如果后台入口文件修改过名字,则自动适配
if (stripos($path, 'admin.php') !== false && stripos($_SERVER['SCRIPT_FILENAME'], 'admin.php') === false) {
if (file_exists($_SERVER['SCRIPT_FILENAME'])) {
$des_path = $_SERVER['SCRIPT_FILENAME'];
}
}
$files[] = array(
'sfile' => $path,
'dfile' => $des_path
);
}
}
// 更新数据库
if (isset($sqls)) {
$db = new DatabaseController();
switch (get_db_type()) {
case 'sqlite':
copy(DOC_PATH . $this->config('database.dbname'), DOC_PATH . STATIC_DIR . '/backup/sql/' . date('YmdHis') . '_' . basename($this->config('database.dbname')));