### 简要描述:
PHPSHE SQL注入#3
### 详细说明:
在添加购物车时,存在过滤。
但是在更新购物车商品数量时,没有过滤,导致SQL注入。
在/module/index/order.php文件:
```
//#####################@ 购物车商品更改数量 @#####################//
case 'cartnum':
$money['order_productmoney'] = $money['order_wlmoney'] = $money['order_money'] = 0;
if (pe_login('user')) {
$result = $db->pe_update('cart', array('user_id'=>$_s_user_id, 'product_id'=>$_g_product_id), array('product_num'=>$_g_product_num));
}
else {
$cart_list = unserialize($_c_cart_list);
$cart_list[$_g_product_id]['product_num'] = $_g_product_num;
$result = is_array($cart_list[$_g_product_id]) ? true : false;
setcookie('cart_list', serialize($cart_list), 0, '/');
}
$cart_info = cart_info($cart_list);
echo json_encode(array('result'=>$result, 'money'=>$cart_info['money']));
break;
```
这里存在登陆和不登陆情况,都没有过滤product_id和product_num参数。
再跟进pe_updeta函数:
```
public function pe_update($table, $where, $set)
{
//处理设置语句
$sqlset = $this->_doset($set);
//处理条件语句
$sqlwhere = $this->_dowhere($where);
return $this->sql_update("update `".dbpre."{$table}` {$sqlset} {$sqlwhere}");
}
```
然后看看这里面处理生生成语句的函数_dowhere 和 _doset:
```
//处理条件语句
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;
}
//处理设置语句
protected function _doset($set)
{
if (is_array($set)) {
foreach ($set as $k => $v) {
$set_arr[] = "`{$k}` = '{$v}'";
}
$sqlset = 'set '.implode($set_arr, ' , ');
}
else {
$sqlset = "set {$set}";
}
return $sqlset;
}
```
也没有过滤参数,最后进入sql语句执行。
### 漏洞证明:
我们测试的是登陆的情况下。
先添加一个商品到购物车,如图:
[<img src="https://images.seebug.org/upload/201312/23214035f9f216487a0590fcd9cfa3d02d82645b.png" alt="5.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201312/23214035f9f216487a0590fcd9cfa3d02d82645b.png)
返回true,添加成功。
在来更新购物车中的商品数量。
先看看正常更新情况下,sql语句的执行情况,如图:
[<img src="https://images.seebug.org/upload/201312/23214049227e16ac296d2fa996a8e83ba427c792.png" alt="6.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201312/23214049227e16ac296d2fa996a8e83ba427c792.png)
这里成功更新了商品数量,以及商品的总金额。
然后我们来修改后面的product_num,即商品的数量,然后添加正常的sql注入语句,看响应也正常更新了,如图:
[<img src="https://images.seebug.org/upload/201312/23214059f1056f098f428d86fce2d6f6361df6d0.png" alt="7.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201312/23214059f1056f098f428d86fce2d6f6361df6d0.png)
这里也修改成功,商品数量和总金额都变化了,我们的sql语句也带入执行了。
最后我们再来修改product_num的数量,然后加入错误的sql语句,此时更新失败了,如图:
[<img src="https://images.seebug.org/upload/201312/232141111a5a7918026433c22c09c9f0d6d001bf.png" alt="8.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201312/232141111a5a7918026433c22c09c9f0d6d001bf.png)
由于这里输入的是错误的sql语句,条件不成立,导致跟心购物车商品失败。
暂无评论