神刀安全网

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

漏洞详情

披露状态:

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

简要描述:

无需登录的前台注入一枚

详细说明:

漏洞发生在注册页面

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

没有过滤cookie参数的值带入到查询中,造成注入

在user.class.php中

code 区域
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函数

code 区域
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函数是过滤函数,继续跟进

code 区域
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来过滤数组的情况,但是不是数组就不过滤。

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

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

sql监控

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

确实没有过滤,把单引号带入了

由于注入点在replace into的values中,然后就可以构造时间盲注exp,构造exp时候的注意用户和邮箱要随机,不要重复了,不然exp是注入不出来的

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

漏洞证明:

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

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

sql监控

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

确实没有过滤,把单引号带入了

由于注入点在replace into的values中,然后就可以构造时间盲注exp,构造exp时候的注意用户和邮箱要随机,不要重复了,不然exp是注入不出来的

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

修复方案:

过滤函数考虑非数组情况

过滤sid参数

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

转载本站任何文章请注明:转载至神刀安全网,谢谢神刀安全网 » 漏洞标题: Tipask前台无条件注入一枚

分享到:更多 ()

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址