网站地图    收藏   

主页 > 后端 > 网站安全 >

ecshop最新版本存储XSS至后台 - 网站安全 - 自学p

来源:自学PHP网    时间:2015-04-16 23:15 作者: 阅读:

[导读] 存储XSS 直接打后台。对电商网站比较容易中问题出现在用户充值页面,充值如果没有付款成功的话,后台查看充值记录位置调用的是act=check,此页面已经过滤但是如果充值了并且完成付...

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

问题出现在用户充值页面,充值如果没有付款成功的话,后台查看充值记录位置调用的是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


成功。
 

修复方案:

过滤
 

自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习

京ICP备14009008号-1@版权所有www.zixuephp.com

网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com

添加评论