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

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

缺陷编号:wooyun-2016-0175702

漏洞标题:Tipask前台无条件注入一枚

相关厂商:Tipask

漏洞作者: he1m4n6a

提交时间:2016-02-16 00:00

修复时间:2016-05-19 12:50

公开时间:2016-05-19 12:50

漏洞类型:SQL注射漏洞

危害等级:高

自评Rank:20

漏洞状态:已交由第三方合作机构(cncert国家互联网应急中心)处理

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2016-02-16: 细节已通知厂商并且等待厂商处理中
2016-02-19: 厂商已经确认,细节仅向厂商公开
2016-02-22: 细节向第三方安全合作伙伴开放(绿盟科技唐朝安全巡航无声信息
2016-04-14: 细节向核心白帽子及相关领域专家公开
2016-04-24: 细节向普通白帽子公开
2016-05-04: 细节向实习白帽子公开
2016-05-19: 细节向公众公开

简要描述:

无需登录的前台注入一枚

详细说明:

漏洞发生在注册页面

http://localhost/Tipask_v2.5_UTF8/tipask/?user/register.html

没有过滤cookie参数的值带入到查询中,造成注入
在user.class.php中

function refresh($uid, $islogin = 1, $cookietime = 0) {
@$sid = tcookie('sid');
$this->base->user = $this->db->fetch_first("SELECT * FROM " . DB_TABLEPRE . "user u," . DB_TABLEPRE . "usergroup g WHERE u.uid=$uid AND u.groupid=g.groupid");
$this->db->query("UPDATE " . DB_TABLEPRE . "user SET `lastlogin`={$this->base->time} WHERE `uid`=$uid"); //更新最后登录时间
$this->db->query("REPLACE INTO " . DB_TABLEPRE . "session (sid,uid,islogin,ip,`time`) VALUES ('$sid',$uid,$islogin,'{$this->base->ip}',{$this->base->time})");
$password = $this->base->user['password'];
$auth = authcode("$uid\t$password", 'ENCODE');
if ($cookietime)
tcookie('auth', $auth, $cookietime);
else
tcookie('auth', $auth);
tcookie('loginuser', '');
$this->base->user['newmsg'] = 0;
}


变量$sid获取cookie中sid的值带入到查询中,跟进tcookie函数

function tcookie($var, $value = 0, $life = 0) {
global $setting;
$cookiepre = $setting['cookie_pre'] ? $setting['cookie_pre'] : 't_';
if (0 === $value) {
$ret = isset($_COOKIE[$cookiepre . $var]) ? $_COOKIE[$cookiepre . $var] : '';
checkattack($var, 'cookie');
return $ret;
} else {
$domain = $setting['cookie_domain'] ? $setting['cookie_domain'] : '';
checkattack($var, 'cookie');
setcookie($cookiepre . $var, $value, $life ? time() + $life : 0, '/', $domain, $_SERVER['SERVER_PORT'] == 443 ? 1 : 0);
}
}


其中checkattack函数是过滤函数,继续跟进

function checkattack($reqarr, $reqtype = 'post') {
$filtertable = array(
'get' => '\'|(and|or)\\b.+?(>|<|=|in|like)|\\/\\*.+?\\*\\/|<\\s*script\\b|\\bEXEC\\b|UNION.+?SELECT|UPDATE.+?SET|INSERT\\s+INTO.+?VALUES|(SELECT|DELETE).+?FROM|(CREATE|ALTER|DROP|TRUNCATE)\\s+(TABLE|DATABASE)',
'post' => '\\b(and|or)\\b.{1,6}?(=|>|<|\\bin\\b|\\blike\\b)|\\/\\*.+?\\*\\/|<\\s\\b|\\bEXEC\\b|UNION.+?SELECT|UPDATE.+?SET|INSERT\\s+INTO.+?VALUES|(SELECT|DELETE).+?FROM|(CREATE|ALTER|DROP|TRUNCATE)\\s+(TABLE|DATABASE)',
'cookie' => '\\b(and|or)\\b.{1,6}?(=|>|<|\\bin\\b|\\blike\\b)|\\/\\*.+?\\*\\/|<\\s*script\\b|\\bEXEC\\b|UNION.+?SELECT|UPDATE.+?SET|INSERT\\s+INTO.+?VALUES|(SELECT|DELETE).+?FROM|(CREATE|ALTER|DROP|TRUNCATE)\\s+(TABLE|DATABASE)'
);
foreach ($reqarr as $reqkey => $reqvalue) {
if (preg_match("/" . $filtertable[$reqtype] . "/is", $reqvalue) == 1 && !in_array($reqkey, array('content'))) {
print('Illegal operation!');
exit(-1);
}
}
}


用foreach来过滤数组的情况,但是不是数组就不过滤。
我们我们发个包试试是不是和预想一样没有过滤

1.png


sql监控

2.png


确实没有过滤,把单引号带入了
由于注入点在replace into的values中,然后就可以构造时间盲注exp,构造exp时候的注意用户和邮箱要随机,不要重复了,不然exp是注入不出来的

3.png


漏洞证明:

我们我们发个包试试是不是和预想一样没有过滤

1.png


sql监控

2.png


确实没有过滤,把单引号带入了
由于注入点在replace into的values中,然后就可以构造时间盲注exp,构造exp时候的注意用户和邮箱要随机,不要重复了,不然exp是注入不出来的

3.png

修复方案:

过滤函数考虑非数组情况
过滤sid参数

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


漏洞回应

厂商回应:

危害等级:中

漏洞Rank:7

确认时间:2016-02-19 12:47

厂商回复:

CNVD未直接复现所述情况,暂未建立与网站管理单位的直接处置渠道,待认领。

最新状态:

暂无