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

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

缺陷编号: WooYun-2013-26458

漏洞标题: ecshop最新版本前台二次注入系列(2)

相关厂商: ShopEx

漏洞作者: blue认证白帽子

提交时间: 2013-06-21 07:55

公开时间: 2013-09-19 07:56

漏洞类型: SQL注射漏洞

危害等级: 高

自评Rank: 20

漏洞状态: 厂商已经确认

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

Tags标签: sql注射漏洞利用技巧 二次注入

10人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2013-06-21: 细节已通知厂商并且等待厂商处理中
2013-06-21: 厂商已经确认,细节仅向厂商公开
2013-06-24: 细节向第三方安全合作伙伴开放(绿盟科技唐朝安全巡航无声信息
2013-08-15: 细节向核心白帽子及相关领域专家公开
2013-08-25: 细节向普通白帽子公开
2013-09-04: 细节向实习白帽子公开
2013-09-19: 细节向公众公开

简要描述:

二次注入第二枚,这个点的注入内容至少进出数据库6次才最终到达了注入结果页面,当然全程可控。

详细说明:

先上注入结果图:

3.png





SQL注入流程:

1.插入注入代码(goods_attr)至订单商品(/wholesale.php可以插入,即商品批发页面,这里的goods_attr和http://**.**.**.**/bugs/wooyun-2010-026421里goods_attr_id是不同的,之前的漏洞即正常在商品页面加入购物车是不能控制goods_attr的,当时goods_attr从数据库商品属性表读取)。

2.png



2.将1生成的订单在用户中心订单查看页执行“放回购物车”操作。

4.png



3.查看购物车页面,注入代码执行

3.png





代码分析:

1./includes/lib_order.php get_cart_goods()方法(读取购物车的商品),1626行起

code 区域
/* 查询规格 */
if (trim($row['goods_attr']) != '')
{
$sql = "SELECT attr_value FROM " . $GLOBALS['ecs']->table('goods_attr') . " WHERE goods_attr_id " .
db_create_in($row['goods_attr']); //goods_attr是购物车商品的属性,所以只要能控制注入代码进入购物车商品就ok了,这是二次注入的原因
$attr_list = $GLOBALS['db']->getCol($sql);
foreach ($attr_list AS $attr)
{
$row['goods_name'] .= ' [' . $attr . '] '; //union select方式可以将数据库内容查询出来显示到页面上
}
}



2. /wholesale.php 160行起(将商品提交到购物车,实际上是提交到了$_SESSION)

code 区域
/*------------------------------------------------------ */
//-- 加入购物车
/*------------------------------------------------------ */
elseif ($_REQUEST['act'] == 'add_to_cart')
{
/* 取得参数 */
$act_id = intval($_POST['act_id']);
$goods_number = $_POST['goods_number'][$act_id];
$attr_id = isset($_POST['attr_id']) ? $_POST['attr_id'] : array();
if(isset($attr_id[$act_id]))
{
$goods_attr = $attr_id[$act_id]; //可控,可以参考我在截图里构造的提交数据
}





3./wholesale.php 380行起(act=='submit_order'), 将$_SESSION里的数据写入订单

code 区域
/* 插入订单商品 */
foreach ($_SESSION['wholesale_goods'] as $goods)
{
//如果存在货品
$product_id = 0;
if (!empty($goods['goods_attr_id']))
{
$goods_attr_id = array();
foreach ($goods['goods_attr_id'] as $value)
{
$goods_attr_id[$value['attr_id']] = $value['attr_val_id'];
}

ksort($goods_attr_id);
$goods_attr = implode('|', $goods_attr_id);

$sql = "SELECT product_id FROM " . $ecs->table('products') . " WHERE goods_attr = '$goods_attr' AND goods_id = '" . $goods['goods_id'] . "'";
$product_id = $db->getOne($sql);
}

$sql = "INSERT INTO " . $ecs->table('order_goods') . "( " .
"order_id, goods_id, goods_name, goods_sn, product_id, goods_number, market_price, ".
"goods_price, goods_attr, is_real, extension_code, parent_id, is_gift) ".
" SELECT '$new_order_id', goods_id, goods_name, goods_sn, '$product_id','$goods[goods_number]', market_price, ".
"'$goods[goods_price]', '$goods[goods_attr]', is_real, extension_code, 0, 0 ".
" FROM " .$ecs->table('goods') .
" WHERE goods_id = '$goods[goods_id]'";
$db->query($sql);



4.到3为止,已经可以将注入代码写到订单商品表(order_goods)里了,接下来就是进入购物车数据表,在用户中心查看订单时有个"放回购物车"操作,可以将订单商品放到购物车数据表(cart)里,然后在查看购物车页面/flow.php即能看到注入结果了(见1的代码分析)

/includes/lib_transaction.php return_to_cart方法 854行起

code 区域
...
// 要返回购物车的商品 //约923行
$return_goods = array(
'goods_id' => $row['goods_id'],
'goods_sn' => addslashes($goods['goods_sn']),
'goods_name' => addslashes($goods['goods_name']),
'market_price' => $goods['market_price'],
'goods_price' => $goods['goods_price'],
'goods_number' => $row['goods_number'],
'goods_attr' => empty($row['goods_attr']) ? '' : addslashes($row['goods_attr']), //看过来,重点在这,$row是订单商品,虽然addslashes了,但这是二次注入,最终会从数据库里再出来进入查询(见1的代码分析)
'goods_attr_id' => empty($row['goods_attr_id']) ? '' : $row['goods_attr_id'],
'is_real' => $goods['is_real'],
'extension_code'=> addslashes($goods['extension_code']),
'parent_id' => '0',
'is_gift' => '0',
'rec_type' => CART_GENERAL_GOODS
);
...

漏洞证明:

2.png



3.png

修复方案:

/includes/lib_order.php get_cart_goods()方法对goods_attr过滤

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


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:15

确认时间:2013-06-21 11:00

厂商回复:

非常感谢您为shopex信息安全做的贡献
我们将尽快修复
非常感谢

最新状态:

暂无


漏洞评价:

对本漏洞信息进行评价,以更好的反馈信息的价值,包括信息客观性,内容是否完整以及是否具备学习价值

漏洞评价(共0人评价):
登陆后才能进行评分

评价

  1. 2013-06-21 08:24 | 啦绯哥 ( 普通白帽子 | Rank:107 漏洞数:20 )
    0

    强势注入

  2. 2013-06-21 08:43 | Kuuki ( 普通白帽子 | Rank:175 漏洞数:25 | :P)
    0

    犀利。。。

  3. 2013-06-21 08:44 | 齐迹 ( 普通白帽子 | Rank:804 漏洞数:104 | 重庆地区招聘安全工程师。sec.zbj.com欢迎...)
    0

    每次不是半夜就是大清早

  4. 2013-06-21 08:50 | blue 认证白帽子 ( 普通白帽子 | Rank:779 漏洞数:70 | 我心中有猛虎,细嗅蔷薇。)
    0

    @齐迹 早上感觉好~

  5. 2013-06-21 09:05 | 1ee ( 普通白帽子 | Rank:105 漏洞数:14 | 看书中....)
    0

    mark 早知就搞其他的,不搞织梦和dz

  6. 2013-06-21 09:51 | YwiSax ( 实习白帽子 | Rank:62 漏洞数:4 | 淡定。)
    0

    这次还有1w拿吗?

  7. 2013-06-21 09:55 | ppt ( 路人 | Rank:11 漏洞数:2 | ) | ( 我猜出了用户名,可我没猜出密码。)
    0

    6次,牛

  8. 2013-06-21 10:31 | Meek ( 路人 | Rank:12 漏洞数:3 | 关注寡妇动态20年 ~)
    0

    坑爹了。

  9. 2013-06-21 12:34 | 小痞子 ( 普通白帽子 | Rank:106 漏洞数:21 | <xss>alert("a")</xss>¥&@&……dssKhwjcw...)
    0

    去年买了个表 学习大大们

  10. 2013-06-24 00:22 | by:安全者 ( 路人 | Rank:22 漏洞数:7 | xxs,sql注入)
    1

    小痞子大牛最近在干嘛?好久不见 前台二次注入太牛了 

  11. 2013-07-27 21:02 | J′aron ( 路人 | Rank:17 漏洞数:5 | 问题真实存在但是影响不大.)
    0

    6....次。。。

  12. 2013-07-28 02:41 | 冰锋刺客 ( 普通白帽子 | Rank:127 漏洞数:20 | 请在监护人陪同下与本人交流)
    0

    哟西

  13. 2013-07-31 14:36 | 小痞子 ( 普通白帽子 | Rank:106 漏洞数:21 | <xss>alert("a")</xss>¥&@&……dssKhwjcw...)
    1

    没闹明白~~咋利用啊....??

登录后才能发表评论,请先 登录