当前位置:WooYun >> 漏洞信息

漏洞概要 关注数(24) 关注此漏洞

缺陷编号:wooyun-2015-0119409

漏洞标题:phpshe任意修改订单状态+鸡肋注入1枚

相关厂商:phpshe.com

漏洞作者: 路人甲

提交时间:2015-06-12 16:22

修复时间:2015-09-15 16:25

公开时间:2015-09-15 16:25

漏洞类型:SQL注射漏洞

危害等级:高

自评Rank:15

漏洞状态:漏洞已经通知厂商但是厂商忽略漏洞

漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 [email protected]

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2015-06-12: 细节已通知厂商并且等待厂商处理中
2015-06-17: 厂商主动忽略漏洞,细节向第三方安全合作伙伴开放
2015-08-11: 细节向核心白帽子及相关领域专家公开
2015-08-21: 细节向普通白帽子公开
2015-08-31: 细节向实习白帽子公开
2015-09-15: 细节向公众公开

简要描述:

phpshe任意修改订单状态+鸡肋注入1枚

详细说明:

先来看看如何修改订单状态,在/include/plugin/payway/alipay/notify_url_sgn.php
就像 WooYun: phpshe最新版sql注入一枚 中说的,厂商一直在确认,但是还是没在根本上解决,这里引起了任意修改订单状态,又可以不花钱买东西了~~
可以对订单状态任意修改,这里以“把订单由未付款改为已付款,等待发货”为例进行说明。

include('../../../../common.php');
require_once("alipay.config.php");
require_once("lib/alipay_notify.class.php");
//计算得出通知验证结果
$alipayNotify = new AlipayNotify($alipay_config);
$verify_result = $alipayNotify->verifyNotify();
//验证成功
if ($verify_result) {
//商户订单号
$out_trade_no = $_POST['out_trade_no'];
//支付宝交易号
$trade_no = $_POST['trade_no'];
$info = $db->pe_select('order', array('order_id'=>$out_trade_no));

//该判断表示买家已在支付宝交易管理中产生了交易记录,但没有付款
if ($_POST['trade_status'] == 'WAIT_BUYER_PAY') {
echo "success"; //请不要修改或删除
}
//该判断表示买家已在支付宝交易管理中产生了交易记录且付款成功,但卖家没有发货
elseif ($_POST['trade_status'] == 'WAIT_SELLER_SEND_GOODS') {
if ($info['order_state'] == 'notpay') {
$order['order_outid'] = $trade_no;
$order['order_payway'] = 'alipay_db';
$order['order_state'] = 'paid';
$order['order_ptime'] = time();
$db->pe_update('order', array('order_id'=>$out_trade_no), $order);
}
echo "success"; //请不要修改或删除
}
//该判断表示卖家已经发了货,但买家还没有做确认收货的操作
elseif ($_POST['trade_status'] == 'WAIT_BUYER_CONFIRM_GOODS') {
if ($info['order_state'] == 'paid') {
$order['order_state'] = 'send';
$order['order_stime'] = time();
$db->pe_update('order', array('order_id'=>$out_trade_no), $order);
}
echo "success"; //请不要修改或删除
}
//该判断表示买家已经确认收货,这笔交易完成
elseif ($_POST['trade_status'] == 'TRADE_FINISHED') {
if ($info['order_state'] == 'notpay') {
$order['order_outid'] = $trade_no;
$order['order_payway'] = 'alipay_js';
$order['order_state'] = 'paid';
$order['order_ptime'] = time();
$db->pe_update('order', array('order_id'=>$out_trade_no), $order);
}
elseif ($info['order_state'] == 'send') {
$order['order_state'] = 'success';
$db->pe_update('order', array('order_id'=>$out_trade_no), $order);
}
echo "success"; //请不要修改或删除
}
//其他状态判断
else {
echo "success";
}
}


wooyun在多个漏洞中提到了如何绕过if ($verify_result) ,因为key默认,alipay_key = esfsclzgahxncgzi3bbe7giwa2ywxyv3,因此,可以计算得到sign,这里可以绕过的。
当$_POST['trade_status'] == 'WAIT_SELLER_SEND_GOODS'时,如上面代码,会把订单的状态UPDATE为paid,如下图

修改订单状态过程副本.jpg


修改前:

修改前副本.jpg


修改后:

修改后副本.jpg


再来说下注入,还是在/include/plugin/payway/alipay/notify_url_sgn.php 为什么说鸡肋呢,就像上面说的,执行一次订单的状态就变了,所以每执行一次,就要换个订单号,我是真的够了~~
WooYun: phpshe最新版sql注入一枚 中,提了$out_trade_no ,我这次说下$trade_no

include('../../../../common.php');
require_once("alipay.config.php");
require_once("lib/alipay_notify.class.php");
//计算得出通知验证结果
$alipayNotify = new AlipayNotify($alipay_config);
$verify_result = $alipayNotify->verifyNotify();
//验证成功
if ($verify_result) {
//商户订单号
$out_trade_no = $_POST['out_trade_no'];
//支付宝交易号
$trade_no = $_POST['trade_no'];
$info = $db->pe_select('order', array('order_id'=>$out_trade_no));

//该判断表示买家已在支付宝交易管理中产生了交易记录,但没有付款
if ($_POST['trade_status'] == 'WAIT_BUYER_PAY') {
echo "success"; //请不要修改或删除
}
//该判断表示买家已在支付宝交易管理中产生了交易记录且付款成功,但卖家没有发货
elseif ($_POST['trade_status'] == 'WAIT_SELLER_SEND_GOODS') {
if ($info['order_state'] == 'notpay') {
$order['order_outid'] = $trade_no;
$order['order_payway'] = 'alipay_db';
$order['order_state'] = 'paid';
$order['order_ptime'] = time();
$db->pe_update('order', array('order_id'=>$out_trade_no), $order);
}
echo "success"; //请不要修改或删除
}


没有防注的措施,这里就简单的证明注入的存在吧,一起修复吧。如下图

注入证明副本.jpg

漏洞证明:

见 详细说明

修复方案:

过滤 处理key

版权声明:转载请注明来源 路人甲@乌云


漏洞回应

厂商回应:

危害等级:无影响厂商忽略

忽略时间:2015-09-15 16:25

厂商回复:

漏洞Rank:4 (WooYun评价)

最新状态:

暂无