记录黑客技术中优秀的内容, 传播黑客文化,分享黑客技术精华

ecshop最新版本存储XSS至后台

2014-09-17 20:50

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

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



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



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]直接插入到数据库了





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成功

后台部分代码

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





成功。



修复方案:

过滤

知识来源: www.wooyun.org/bugs/wooyun-2014-065471

阅读:91450 | 评论:0 | 标签:xss

想收藏或者和大家分享这篇好文章→复制链接地址

“ecshop最新版本存储XSS至后台”共有0条留言

发表评论

姓名:

邮箱:

网址:

验证码:

公告

九层之台,起于累土;黑客之术,始于阅读

推广

工具

标签云

本页关键词