### 简要描述: phpshe任意修改订单状态+鸡肋注入1枚 ### 详细说明: 先来看看如何修改订单状态,在/include/plugin/payway/alipay/notify_url_sgn.php 就像 [WooYun: phpshe最新版sql注入一枚](http://www.wooyun.org/bugs/wooyun-2015-0103612) 中说的,厂商一直在确认,但是还是没在根本上解决,这里引起了任意修改订单状态,又可以不花钱买东西了~~ 可以对订单状态任意修改,这里以“把订单由未付款改为已付款,等待发货”为例进行说明。 ``` 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;...
### 简要描述: phpshe任意修改订单状态+鸡肋注入1枚 ### 详细说明: 先来看看如何修改订单状态,在/include/plugin/payway/alipay/notify_url_sgn.php 就像 [WooYun: phpshe最新版sql注入一枚](http://www.wooyun.org/bugs/wooyun-2015-0103612) 中说的,厂商一直在确认,但是还是没在根本上解决,这里引起了任意修改订单状态,又可以不花钱买东西了~~ 可以对订单状态任意修改,这里以“把订单由未付款改为已付款,等待发货”为例进行说明。 ``` 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,如下图 [<img src="https://images.seebug.org/upload/201506/0923512951ee194cf1a2380767f502bf37d63b6a.jpg" alt="修改订单状态过程副本.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201506/0923512951ee194cf1a2380767f502bf37d63b6a.jpg) 修改前: [<img src="https://images.seebug.org/upload/201506/0923514656fe3af87b0548ff5a1ffce8cd099f70.jpg" alt="修改前副本.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201506/0923514656fe3af87b0548ff5a1ffce8cd099f70.jpg) 修改后: [<img src="https://images.seebug.org/upload/201506/09235157539035ddd8e0691883c54a38780b0129.jpg" alt="修改后副本.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201506/09235157539035ddd8e0691883c54a38780b0129.jpg) 再来说下注入,还是在/include/plugin/payway/alipay/notify_url_sgn.php 为什么说鸡肋呢,就像上面说的,执行一次订单的状态就变了,所以每执行一次,就要换个订单号,我是真的够了~~ 在 [WooYun: phpshe最新版sql注入一枚](http://www.wooyun.org/bugs/wooyun-2015-0103612) 中,提了$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";//请不要修改或删除 } ``` 没有防注的措施,这里就简单的证明注入的存在吧,一起修复吧。如下图 [<img src="https://images.seebug.org/upload/201506/09235231242e46eaeedd7fe6f2ab76dd99c9cf80.jpg" alt="注入证明副本.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201506/09235231242e46eaeedd7fe6f2ab76dd99c9cf80.jpg) ### 漏洞证明: 见 详细说明