ECSHOP /admin/affiliate_ck.php sql注入

/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']);

发表评论