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

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

缺陷编号: WooYun-2014-65471

漏洞标题: ecshop最新版本存储XSS至后台

相关厂商: ShopEx

漏洞作者: 网络小兵

提交时间: 2014-06-19 13:45

公开时间: 2014-09-17 13:46

漏洞类型: XSS跨站脚本攻击

危害等级: 高

自评Rank: 10

漏洞状态: 厂商已经确认

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

Tags标签: 持久型xss

7人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

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

简要描述:

存储XSS 直接打后台。对电商网站比较容易中

详细说明:

问题出现在用户充值页面,充值如果没有付款成功的话,后台查看充值记录位置调用的是act=check,此页面已经过滤

但是如果充值了并且完成付款,后台查看充值记录位置 变成act=edit 此页面没有过滤,所以导致问题发生。



code 区域
user.php
1424行
/* 变量初始化 */
$surplus = array(
'user_id' => $user_id,
'rec_id' => !empty($_POST['rec_id']) ? intval($_POST['rec_id']) : 0,
'process_type' => isset($_POST['surplus_type']) ? intval($_POST['surplus_type']) : 0,
'payment_id' => isset($_POST['payment_id']) ? intval($_POST['payment_id']) : 0,
'user_note' => isset($_POST['user_note']) ? trim($_POST['user_note']) : '', //没有进行过滤
'amount' => $amount
);
1484行
surplus['rec_id'] = insert_user_account($surplus, $amount);//直接带入insert_user_account()





下面我们看看include 下的lib_clips.php



code 区域
359行
function insert_user_account($surplus, $amount)
{
$sql = 'INSERT INTO ' .$GLOBALS['ecs']->table('user_account').
' (user_id, admin_user, amount, add_time, paid_time, admin_note, user_note, process_type, payment, is_paid)'.
" VALUES ('$surplus[user_id]', '', '$amount', '".gmtime()."', 0, '', '$surplus[user_note]', '$surplus[process_type]', '$surplus[payment]', 0)";
$GLOBALS['db']->query($sql);

return $GLOBALS['db']->insert_id();
}

$surplus[user_note]直接插入到数据库了





code 区域
include/lib_payment.php  225行

elseif ($pay_log['order_type'] == PAY_SURPLUS)
{
$sql = 'SELECT `id` FROM ' . $GLOBALS['ecs']->table('user_account') . " WHERE `id` = '$pay_log[order_id]' AND `is_paid` = 1 LIMIT 1"; //更新付款状态
$res_id=$GLOBALS['db']->getOne($sql);
if(empty($res_id))
{
/* 更新会员预付款的到款状态 */
$sql = 'UPDATE ' . $GLOBALS['ecs']->table('user_account') .
" SET paid_time = '" .gmtime(). "', is_paid = 1" .
" WHERE id = '$pay_log[order_id]' LIMIT 1";
$GLOBALS['db']->query($sql);







然后看看后台的《充值和提现申请》,没有进行过滤,直接取出。XSS成功

后台部分代码

code 区域
admin/user_account.php 103行
if ($_REQUEST['act'] == 'edit')
{
/* 取得余额信息 */
$user_account = $db->getRow("SELECT * FROM " .$ecs->table('user_account') . " WHERE id = '$id'");//没有过滤的

// 如果是负数,去掉前面的符号
$user_account['amount'] = str_replace('-', '', $user_account['amount']);

/* 取得会员名称 */
$sql = "SELECT user_name FROM " .$ecs->table('users'). " WHERE user_id = '$user_account[user_id]'";
$user_name = $db->getOne($sql);
}

漏洞证明:

第一步,前台会员中心 充值

1.jpg





第二步,完成付款(重要步骤) ,如果不付款的话后台是未付款状态,那个位置是已经过滤的了,只有付款成功了,后台会变成付款成功状态。



第三步



后台管理员查看充值和提现申请

2.jpg





成功。



修复方案:

过滤

版权声明:转载请注明来源 网络小兵@乌云


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:12

确认时间:2014-06-20 10:56

厂商回复:

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

最新状态:

暂无


漏洞评价:

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

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

评价

  1. 2014-06-20 12:16 | mango ( 核心白帽子 | Rank:2081 漏洞数:303 | 解决问题的第一步,是要承认问题的存在。)
    0

    最后还是被提交了、、、、 - - 坑爹!

  2. 2014-08-21 14:47 | 九九 ( 路人 | Rank:5 漏洞数:4 | 暂无。)
    0

    感觉这个号坑爹..一定要付款...付款啊..

  3. 2014-09-17 17:47 | 迦南 ( 路人 | Rank:14 漏洞数:11 | 我不是玩黑,我就是认真)
    0

    和DZ的XSS如出一辙

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