WooYun-2014-52363:CSDJCMS程式舞曲最新版Sql 一枚

漏洞作者: ′雨。认证白帽子

来源:http://www.wooyun.org/bugs/wooyun-2014-052363

简要描述

看到官网上又更新了 2014-2-25 加强了SQL安全注入。特别感谢白帽子:(′ 雨。、C4nf3ng、Jim叔叔、寂寞的瘦子、lxj616 )对程序的漏洞检测。 还感谢了各白帽子啊 还不错。

那就继续挖挖?

详细说明

在user\pay.php中

public function tenpay_return_url() { 

        require_once (CSCMSPATH."tenpay/ResponseHandler.class.php");

        $resHandler = new ResponseHandler();

        $resHandler->setKey($key);

        //判断签名

        if($resHandler->isTenpaySign()) {

            //通知id

            $notify_id = $resHandler->getParameter("notify_id");

            //商户订单号

            $out_trade_no = $resHandler->getParameter("out_trade_no");

            //财付通订单号

            $transaction_id = $resHandler->getParameter("transaction_id");

            //如果有使用折扣券,discount有值,total_fee+discount=原请求的total_fee

            $discount = $resHandler->getParameter("discount");

            //支付结果

            $trade_state = $resHandler->getParameter("trade_state");

            //交易模式,1即时到账

            $trade_mode = $resHandler->getParameter("trade_mode");

            if("1" == $trade_mode ) {

                if( "0" == $trade_state){ 

                                $row=$this->db->query("select CS_RMB from ".CS_SqlPrefix."pay where CS_Dingdan='".$out_trade_no."'")->row();

                                if(!$row){

                                        $this->CsdjSkins->Msg_url('验证失败,该定单不存在!',site_url('user')); 

                                }

                                $this->CsdjSkins->Msg_url('恭喜您,成功充值了 '.$row->CS_RMB.' 元,若出现问题请尽快联系客服,请牢记您的定单号:'.$out_trade_no.'!',site_url('user')); 

                } else {

                    //当做不成功处理

                    echo "<br/>" . "即时到帐支付失败" . "<br/>";

                }

            }elseif( "2" == $trade_mode  ) {

                if( "0" == $trade_state) {

                    echo "<br/>" . "中介担保支付成功" . "<br/>";

                } else {

                    echo "<br/>" . "中介担保支付失败" . "<br/>";

                }

            }

        } else {

            echo "<br/>" . "认证签名失败" . "<br/>";

            echo $resHandler->getDebugInfo() . "<br>";

getParameter 就相当request把?

这里是没有过滤的。 但是有点验证。

function isTenpaySign() {

        $signPars = "";

        ksort($this->parameters);

        foreach($this->parameters as $k => $v) {

            if("sign" != $k && "" != $v) {

                $signPars .= $k . "=" . $v . "&";

            }

        }

        $signPars .= "key=" . $this->getKey();

        $sign = strtolower(md5($signPars));

        $tenpaySign = strtolower($this->getParameter("sign"));

        //debug信息

        $this->_setDebugInfo($signPars . " => sign:" . $sign .

                " tenpaySign:" . $this->getParameter("sign"));

        return $sign == $tenpaySign;

    }

相等即可。

Come and Sql it.

漏洞证明

官网测试成功。

还可以充值任意金额。

修复方案

Check it.