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

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

缺陷编号:wooyun-2011-02960

漏洞标题:ECShop 2.7.2 红包注入漏洞

相关厂商:ShopEx

漏洞作者: tenzy

提交时间:2011-10-09 20:51

修复时间:2011-11-08 20:51

公开时间:2011-11-08 20:51

漏洞类型:SQL注射漏洞

危害等级:高

自评Rank:15

漏洞状态:厂商已经确认

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2011-10-09: 细节已通知厂商并且等待厂商处理中
2011-10-10: 厂商已经确认,细节仅向厂商公开
2011-10-20: 细节向核心白帽子及相关领域专家公开
2011-10-30: 细节向普通白帽子公开
2011-11-09: 细节向实习白帽子公开
2011-11-08: 细节向公众公开

简要描述:

flow.php页面看似intval的红包ID,其实可以注入。以下文章仅从代码推测,并未进行测试,不过这太明显了,就不测试了,各位看官测试失败请跟帖骂娘,死亡节奏技术小组、恶灵战队路过。

详细说明:

/flow.php 1168行开始

$bonus = bonus_info(intval($_GET['bonus']));
if ((!empty($bonus) && $bonus['user_id'] == $_SESSION['user_id']) || $_GET['bonus'] == 0)
{
$order['bonus_id'] = $_GET['bonus'];
}
else
{
$order['bonus_id'] = 0;
$result['error'] = $_LANG['invalid_bonus'];
}
/* 计算订单的费用 */
$total = order_fee($order, $cart_goods, $consignee);


$bonus = bonus_info(intval($_GET['bonus']));
上面这一句貌似把$_GET['bonus']给变整形了,没错,这句话没问题,继续向下看,

if ((!empty($bonus) && $bonus['user_id'] == $_SESSION['user_id']) || $_GET['bonus'] == 0)
{
$order['bonus_id'] = $_GET['bonus'];
}


上面代码显示:如果通过GET来的红包ID获取到红包信息并且红包属于你,
就执行下面这句

$order['bonus_id'] = $_GET['bonus'];


看到没有,这里$order['bonus_id']就获得了一个没有过滤的红包ID,
然后
下面这句

/* 计算订单的费用 */
$total = order_fee($order, $cart_goods, $consignee);


未经过滤的红包ID进入了order_fee函数,来看看这个函数的代码(在/includes/lib_order.php中),

function order_fee($order, $goods, $consignee)
{
//.....省略若干行,来到643行,
if (!empty($order['bonus_id']))
{
$bonus = bonus_info($order['bonus_id']);
$total['bonus'] = $bonus['type_money'];
}
}


未经过滤的红包ID再次进入bonus_info函数,这个函数也是在上面的这个文件里,
来到1408行

function bonus_info($bonus_id, $bonus_sn = '')
{
$sql = "SELECT t.*, b.* " .
"FROM " . $GLOBALS['ecs']->table('bonus_type') . " AS t," .
$GLOBALS['ecs']->table('user_bonus') . " AS b " .
"WHERE t.type_id = b.bonus_type_id ";
if ($bonus_id > 0)
{
$sql .= "AND b.bonus_id = '$bonus_id'";
}
else
{
$sql .= "AND b.bonus_sn = '$bonus_sn'";
}
return $GLOBALS['db']->getRow($sql);
}


恰好,字符串大于0,因此注入字符串可以顺利进入SQL,好了,恭喜发财,rank值多给点

漏洞证明:

就不证明,自己看代码

修复方案:

在function bonus_info($bonus_id, $bonus_sn = '')函数里把$bonus_id intval一下不就OK了么

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


漏洞回应

厂商回应:

危害等级:中

漏洞Rank:10

确认时间:2011-10-10 09:53

厂商回复:

感谢提交,我们尽快处理

最新状态:

暂无


漏洞评价:

评论

  1. 2011-10-09 21:28 | xsser 认证白帽子 ( 普通白帽子 | Rank:254 漏洞数:18 | 当我又回首一切,这个世界会好吗?)

    除了顶我还有什么好说的呢

  2. 2011-10-09 21:54 | Mr.杨总 ( 路人 | Rank:14 漏洞数:4 | 绿色 无毒 你懂得。。。。心要宽 。。。)

    我试试

  3. 2011-10-10 10:09 | tenzy ( 普通白帽子 | Rank:176 漏洞数:21 | Need not to know)

    洞洞确实存在,求精华。。。

  4. 2011-10-10 10:22 | xsser 认证白帽子 ( 普通白帽子 | Rank:254 漏洞数:18 | 当我又回首一切,这个世界会好吗?)

    必须精华

  5. 2011-10-10 10:32 | Ray ( 实习白帽子 | Rank:75 漏洞数:7 )

    Ecshop的代码是在magic_quote_gpc为on的实现上写的,这个query用的bonus_id在单引号内,注射不了吧~

  6. 2011-10-10 11:41 | tenzy ( 普通白帽子 | Rank:176 漏洞数:21 | Need not to know)

    嗯,可以骂娘了。楼上说得对。但是发现另一处在magic_quote_gpc=off的情况下可以盲注。不受ecshop内核过滤GET和POST影响

  7. 2011-10-10 11:42 | tenzy ( 普通白帽子 | Rank:176 漏洞数:21 | Need not to know)

    现在这个发现只能说明存在过滤不严,但是无法利用,顶多算是代码稍有瑕疵,不算安全漏洞

  8. 2011-10-11 21:57 | QQ852451559 ( 实习白帽子 | Rank:79 漏洞数:18 | 学生党)

    求解释.那这算什么~

  9. 2011-11-08 21:00 | xsser 认证白帽子 ( 普通白帽子 | Rank:254 漏洞数:18 | 当我又回首一切,这个世界会好吗?)

    混了10分

  10. 2013-07-16 10:35 | 乌帽子 ( 路人 | Rank:29 漏洞数:3 | 学习黑客哪家强 | 中国山东找蓝翔 | sql...)

    实践出真知果然没错