ECSHOP商城系统过滤不严导致SQL注入漏洞


添加时间:
2010-08-21

系统编号:
WAVDB-01695

影响版本:
ECSHOP 2.7.2 Release 0604

程序介绍:

ECSHOP是一款开源免费的网上商店系统。由专业的开发团队升级维护,为您提供及时高效的技术支持,您还可以根据自己的商务特征对ECSHOP进行定制,增加自己商城的特色功能。

漏洞分析:

在include_libcommon.php中存在如下函数

 
  1. function get_package_info($id)  
  2.   
  3. {  
  4.   
  5.     global $ecs$db,$_CFG;  
  6.   
  7.   
  8.   
  9.     $now = gmtime();  
  10.   
  11.   
  12.   
  13.     $sql = "SELECT act_id AS id,  act_name AS package_name, goods_id , goods_name, start_time, end_time, act_desc, ext_info".  
  14.   
  15.            " FROM " . $GLOBALS['ecs']->table('goods_activity') .  
  16.   
  17.            " WHERE act_id='$id' AND act_type = " . GAT_PACKAGE;  
  18.   
  19.   
  20.   
  21.     $package = $db->GetRow($sql);  
  22.   
  23.   
  24.   
  25.     /* 将时间转成可阅读格式 */  
  26.   
  27.     if ($package['start_time'] <= $now && $package['end_time'] >= $now)  
  28.   
  29.     {  
  30.   
  31.         $package['is_on_sale'] = "1";  
  32.   
  33.     }  
  34.   
  35.     else  
  36.   
  37.     {  
  38.   
  39.         $package['is_on_sale'] = "0";  
  40.   
  41.     }  
  42.   
  43.     $package['start_time'] = local_date('Y-m-d H:i'$package['start_time']);  
  44.   
  45.     $package['end_time']   = local_date('Y-m-d H:i'$package['end_time']);  
  46.   
  47.     $row = unserialize($package['ext_info']);  
  48.   
  49.     unset($package['ext_info']);  
  50.   
  51.     if ($row)  
  52.   
  53.     {  
  54.   
  55.         foreach ($row as $key=>$val)  
  56.   
  57.         {  
  58.   
  59.             $package[$key] = $val;  
  60.   
  61.         }  
  62.   
  63.     }  
  64.   
  65.   
  66.   
  67.     $sql = "SELECT pg.package_id, pg.goods_id, pg.goods_number, pg.admin_id, ".  
  68.   
  69.            " g.goods_sn, g.goods_name, g.market_price, g.goods_thumb, g.is_real, ".  
  70.   
  71.            " IFNULL(mp.user_price, g.shop_price * '$_SESSION[discount]') AS rank_price " .  
  72.   
  73.            " FROM " . $GLOBALS['ecs']->table('package_goods') . " AS pg ".  
  74.   
  75.            "   LEFT JOIN "$GLOBALS['ecs']->table('goods') . " AS g ".  
  76.   
  77.            "   ON g.goods_id = pg.goods_id ".  
  78.   
  79.            " LEFT JOIN " . $GLOBALS['ecs']->table('member_price') . " AS mp ".  
  80.   
  81.                 "ON mp.goods_id = g.goods_id AND mp.user_rank = '$_SESSION[user_rank]' ".  
  82.   
  83.            " WHERE pg.package_id = " . $id" ".  
  84.   
  85.            " ORDER BY pg.package_id, pg.goods_id";  
  86.   
  87.   
  88.   
  89.     $goods_res = $GLOBALS['db']->getAll($sql);  
  90.   
  91.   
  92.   
  93.     $market_price        = 0;  
其中$id没有经过严格过滤就直接进入了SQL查询,导致一个SQL注射漏洞。
在系统的lib_order.php中存在一个该函数的调用
 
  1. function add_package_to_cart($package_id$num = 1)  
  2.   
  3. {  
  4.   
  5.     $GLOBALS['err']->clean();  
  6.   
  7.   
  8.   
  9.     /* 取得礼包信息 */  
  10.   
  11.     $package = get_package_info($package_id);  
  12.   
  13.   
  14.   
  15.     if (emptyempty($package))  
  16.   
  17.     {  
  18.   
  19.         $GLOBALS['err']->add($GLOBALS['_LANG']['goods_not_exists'], ERR_NOT_EXISTS);  
  20.   
  21.   
  22.   
  23.         return false;  
  24.   
  25.     }  
在flow.php中存在可控的输入源
 
  1. $package = $json->decode($_POST['package_info']);  
  2.   
  3.   
  4.   
  5.     /* 如果是一步购物,先清空购物车 */  
  6.   
  7.     if ($_CFG['one_step_buy'] == '1')  
  8.   
  9.     {  
  10.   
  11.         clear_cart();  
  12.   
  13.     }  
  14.   
  15.   
  16.   
  17.     /* 商品数量是否合法 */  
  18.   
  19.     if (!is_numeric($package->number) || intval($package->number) <= 0)  
  20.   
  21.     {  
  22.   
  23.         $result['error']   = 1;  
  24.   
  25.         $result['message'] = $_LANG['invalid_number'];  
  26.   
  27.     }  
  28.   
  29.     else  
  30.   
  31.     {  
  32.   
  33.         /* 添加到购物车 */  
  34.   
  35.         if (add_package_to_cart($package->package_id, $package->number))  
  36.   
  37.         {  
  38.   
  39.             if ($_CFG['cart_confirm'] > 2)  
$package->package_id来源于输入





解决方案:
厂商补丁
ECSHOP
----------
目前厂商还没有提供补丁或者升级程序,我们建议使用此软件的用户随时关注厂商的主页以获取最新版本:
http://www.ecshop.com

信息来源:
<*来源: WooYun
链接: http://www.wooyun.org/bug.php?action=view&id=248*>