### 简要描述: 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...
### 简要描述: 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语句,条件不成立,导致跟心购物车商品失败。