前言
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