来源:自学PHP网 时间:2015-04-15 15:00 作者: 阅读:次
[导读] 昨天在wooyun上看了看 以前blue大牛发的ecshop的洞, 还有一些其他的不过有些没给出利用方法 自己来做个分析把。 新版本的应该都补了把。if (!get_magic_quotes_gpc()){ if (!empty($_GET))...
昨天在wooyun上看了看 以前blue大牛发的ecshop的洞, 还有一些其他的 if (!get_magic_quotes_gpc()) { if (!empty($_GET)) { $_GET = addslashes_deep($_GET); } if (!empty($_POST)) { $_POST = addslashes_deep($_POST); } $_COOKIE = addslashes_deep($_COOKIE); $_REQUEST = addslashes_deep($_REQUEST); }在Magic_quotes_gpc 为off的情况下 用addslashes_deep 对 GET POST COOKIE REQUEST 进行处理 ?[Copy to clipboard]View Code PHP
$pay_code = !empty($_REQUEST['code']) ? trim($_REQUEST['code']) : ''; 省略省略 $sql = "SELECT COUNT(*) FROM " . $ecs->table('payment') . " WHERE pay_code = '$pay_code' AND enabled = 1"; if ($db->getOne($sql) == 0) { $msg = $_LANG['pay_disabled']; } else { $plugin_file = 'includes/modules/payment/' . $pay_code . '.php';
这里还包含了。 不过由于addslashes 不能截断 所以基本无用 长文件截断也不行。。 function respond() { if (!empty($_POST)) { foreach($_POST as $key => $data) { $_GET[$key] = $data; } } $payment = get_payment($_GET['code']); $seller_email = rawurldecode($_GET['seller_email']); $order_sn = str_replace($_GET['subject'], '', $_GET['out_trade_no']); $order_sn = trim($order_sn); /* 检查支付的金额是否相符 */ if (!check_money($order_sn, $_GET['total_fee'])) { return false; } 204行。 来看看check_money的方法 function check_money($log_id, $money) { $sql = 'SELECT order_amount FROM ' . $GLOBALS['ecs']->table('pay_log') . " WHERE log_id = '$log_id'"; $amount = $GLOBALS['db']->getOne($sql); if ($money == $amount) { return true; } else { return false; } } 当然有单引号。 是把order_sn 带入了这个函数中。 $order_sn = str_replace($_GET['subject'], '', $_GET['out_trade_no']);要查找的值和被搜索的字符串都是可控的。 而且是替换为空 因为addslashes 是会对Null 也转义的。 elseif ($_REQUEST['step'] == 'update_cart') { if (isset($_POST['goods_number']) && is_array($_POST['goods_number'])) { flow_update_cart($_POST['goods_number']); } show_message($_LANG['update_cart_notice'], $_LANG['back_to_cart'], 'flow.php'); exit; }只要 设置了$_POST['goods_number'] 和这个是个数组 就进flow_update_cart 跟进去看看 { /* 处理 */ foreach ($arr AS $key => $val) { $val = intval(make_semiangle($val)); if ($val <= 0 || !is_numeric($key)) { continue; } //查询: $sql = "SELECT `goods_id`, `goods_attr_id`, `product_id`, `extension_code` FROM" .$GLOBALS['ecs']->table('cart'). " WHERE rec_id='$key' AND session_id='" . SESS_ID . "'"; $goods = $GLOBALS['db']->getRow($sql);把数组 以key=>value 遍历出来。 然后value 被转整。 但是key没有被过滤、 只要 value 大于1 或者key不是数字就好 肯定是满足前面的个。 0×03 依旧flow.php 二次猪肉。 INSERT INTO `ecshop`.`ecs_cart` (user_id, session_id, goods_id, goods_sn, product_id, goods_name, market_price, goods_price, goods_number, goods_attr, is_real, extension_code, parent_id, rec_type, is_gift, is_shipping, goods_attr_id) VALUES ('0', '8bf4348243d6ceae0845e95705e9c4be', '1', 'xxxxxxxxx', '0', 'xxxxxxxxxxxxxxxxxxx', '0', '0', '1', '', '1', '', '0', '0', '0', '0', 'yu,yu\'') 添加商品到购物车所执行的语句, 单引号当然会被转义。 // 更新:添加到购物车 if (addto_cart($goods->goods_id, $goods->number, $goods->spec, $goods->parent)) { if ($_CFG['cart_confirm'] > 2) { $result['message'] = ''; } else { $result['message'] = $_CFG['cart_confirm'] == 1 ? $_LANG['addto_cart_success_1'] : $_LANG['addto_cart_success_2']; } $result['content'] = insert_cart_info(); $result['one_step_buy'] = $_CFG['one_step_buy']; 继续跟。 代码太多了 我就复制下大概的。 } } } } /* 计算商品的促销价格 */ $spec_price = spec_price($spec); $goods_price = get_final_price($goods_id, $num, true, $spec); $goods['market_price'] += $spec_price; $goods_attr = get_goods_attr_info($spec); $goods_attr_id = join(',', $spec); $spec 是可控的, function get_final_price($goods_id, $goods_num = '1', $is_spec_price = false, $spec = array()) { $final_price = '0'; //ÉÌÆ•×îÖÕ¹ºÂò¼Û¸ñ $volume_price = '0'; //ÉÌÆ•ÓŻݼ۸ñ $promote_price = '0'; //ÉÌÆ•´ÙÏú¼Û¸ñ $user_price = '0'; //ÉÌÆ•»áÔ±¼Û¸ñ 省略省略 if ($is_spec_price) { if (!empty($spec)) { $spec_price = spec_price($spec); $final_price += $spec_price; } } 继续跟。 function spec_price($spec) { if (!empty($spec)) { $where = db_create_in($spec, 'goods_attr_id'); $sql = 'SELECT SUM(attr_price) AS attr_price FROM ' . $GLOBALS['ecs']->table('goods_attr') . " WHERE $where"; 看看db_create_in if (empty($item_list)) { return $field_name . " IN ('') "; } else { if (!is_array($item_list)) { $item_list = explode(',', $item_list); } $item_list = array_unique($item_list); $item_list_tmp = ''; foreach ($item_list AS $item) { if ($item !== '') { $item_list_tmp .= $item_list_tmp ? ",'$item'" : "'$item'"; } } if (empty($item_list_tmp)) { return $field_name . " IN ('') "; } else { return $field_name . ' IN (' . $item_list_tmp . ') '; } } } 如果不是数组就以逗号来切割成为数组 然后去重复。然后循环遍历 赋值。 是数组的话就直接去重复然后循环。 测试了很久 不知道是不是我无法理解啊, 还是没搞定。 但是当更新的时候 那就试试直接提交 不用逗号的把。 Demo/index.php if(file_exists(ROOT_PATH ."data/install.lock")) { die('You have installed! '); }如果存在lock 就会退出了。 不过找到了个超级老的ecshop 还是没判断lock的。 而且这个在管理进入后台后 就会提示手动要删掉demo 所以很多都没咯。 case 'setup_ucenter' : include_once(ROOT_PATH . 'includes/cls_json.php'); $json = new JSON(); $result = array('error' => 0, 'message' => ''); $app_type = 'ECSHOP'; $app_name = $db->getOne('SELECT value FROM ' . $ecs->table('shop_config') . " WHERE code = 'shop_name'"); $app_url = url(); $app_charset = EC_CHARSET; $app_dbcharset = strtolower((str_replace('-', '', EC_CHARSET))); $ucapi = !empty($_POST['ucapi']) ? trim($_POST['ucapi']) : '';//可控 $ucip = !empty($_POST['ucip']) ? trim($_POST['ucip']) : '';//可控 $dns_error = false; 省略。 $ucconfig = dfopen($ucapi.'/index.php', 500, $postdata, '', 1, $ucip); 省略。 elseif(($succeed = save_uc_config($ucconfig."|$ucapi|$ucip"))) function save_uc_config($config) { print_r ($config);exit; global $db, $ecs; $success = false; list($appauthkey, $appid, $ucdbhost, $ucdbname, $ucdbuser, $ucdbpw, $ucdbcharset, $uctablepre, $uccharset, $ucapi, $ucip) = explode('|', $config); $config_file = ROOT_PATH . 'data/config.php'; $s = file_get_contents($config_file); $s = insertconfig($s, "/\?\>/",""); $link = mysql_connect($ucdbhost, $ucdbuser, $ucdbpw, 1); $uc_connnect = $link && mysql_select_db($ucdbname, $link) ? 'mysql' : 'post'; $s = insertconfig($s, "/define\('EC_CHARSET',\s*'.*?'\);/i", "define('EC_CHARSET', '" . EC_CHARSET . "');"); $s = insertconfig($s, "/\/\*\=*UCenter\=*\*\//","/*=================UCenter=======================*/"); $s = insertconfig($s, "/define\('UC_CONNECT',\s*'.*?'\);/i", "define('UC_CONNECT', '$uc_connnect');"); $s = insertconfig($s, "/define\('UC_DBHOST',\s*'.*?'\);/i", "define('UC_DBHOST', '$ucdbhost');"); $s = insertconfig($s, "/define\('UC_DBUSER',\s*'.*?'\);/i", "define('UC_DBUSER', '$ucdbuser');"); $s = insertconfig($s, "/define\('UC_DBPW',\s*'.*?'\);/i", "define('UC_DBPW', '$ucdbpw');"); $s = insertconfig($s, "/define\('UC_DBNAME',\s*'.*?'\);/i", "define('UC_DBNAME', '$ucdbname');"); $s = insertconfig($s, "/define\('UC_DBCHARSET',\s*'.*?'\);/i", "define('UC_DBCHARSET', '$ucdbcharset');"); $s = insertconfig($s, "/define\('UC_DBTABLEPRE',\s*'.*?'\);/i", "define('UC_DBTABLEPRE', '`$ucdbname`.$uctablepre');"); $s = insertconfig($s, "/define\('UC_DBCONNECT',\s*'.*?'\);/i", "define('UC_DBCONNECT', '0');"); $s = insertconfig($s, "/define\('UC_KEY',\s*'.*?'\);/i", "define('UC_KEY', '$appauthkey');"); $s = insertconfig($s, "/define\('UC_API',\s*'.*?'\);/i", "define('UC_API', '$ucapi');"); $s = insertconfig($s, "/define\('UC_CHARSET',\s*'.*?'\);/i", "define('UC_CHARSET', '$uccharset');"); $s = insertconfig($s, "/define\('UC_IP',\s*'.*?'\);/i", "define('UC_IP', '$ucip');"); $s = insertconfig($s, "/define\('UC_APPID',\s*'?.*?'?\);/i", "define('UC_APPID', '$appid');"); $s = insertconfig($s, "/define\('UC_PPP',\s*'?.*?'?\);/i", "define('UC_PPP', '20');"); $s = insertconfig($s, "/\?\>/","?>"); return file_put_contents($config_file, $s);以| 来分割, 然后内容加上 UC_KEY UC API 这些。 然后写入data/config.php
|
自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习
京ICP备14009008号-1@版权所有www.zixuephp.com
网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com