前言
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'))); break; case