### 简要描述: 来了个新厂商。 挖一下把。 开放+封闭源代码 封闭源代码,普通用户使用加密后的代码,付费用户使用开放的源代码,使商城更安全 对于我这种屌丝只能用免费版 就是zend后的代码。 不过还是有几个文件没zend。 就只看这几个文件了。 ### 详细说明: 找了几个没zend的文件来看看 。 第一处 ali/notify_url.php中 ``` $alipayNotify = new AlipayNotify($aliapy_config); $verify_result = $alipayNotify->verifyNotify(); if($verify_result) {//验证成功 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //请在这里加上商户的业务逻辑程序代 //——请根据您的业务逻辑来编写程序(以下代码仅作参考)—— //获取支付宝的通知返回参数,可参考技术文档中服务器异步通知参数列表 $out_trade_no= $_POST['out_trade_no']; //获取订单号 $trade_no= $_POST['trade_no']; //获取支付宝交易号 $total_fee= $_POST['total_fee'];//获取总价格 if($_POST['trade_status'] == 'TRADE_FINISHED' ||$_POST['trade_status'] == 'TRADE_SUCCESS') { //交易成功结束 //判断该笔订单是否在商户网站中已经做过处理(可参考“集成教程”中“3.4返回数据处理”) //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序 //如果有做过处理,不执行商户的业务程序 $arr=include("../Conf/config.php");...
### 简要描述: 来了个新厂商。 挖一下把。 开放+封闭源代码 封闭源代码,普通用户使用加密后的代码,付费用户使用开放的源代码,使商城更安全 对于我这种屌丝只能用免费版 就是zend后的代码。 不过还是有几个文件没zend。 就只看这几个文件了。 ### 详细说明: 找了几个没zend的文件来看看 。 第一处 ali/notify_url.php中 ``` $alipayNotify = new AlipayNotify($aliapy_config); $verify_result = $alipayNotify->verifyNotify(); if($verify_result) {//验证成功 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //请在这里加上商户的业务逻辑程序代 //——请根据您的业务逻辑来编写程序(以下代码仅作参考)—— //获取支付宝的通知返回参数,可参考技术文档中服务器异步通知参数列表 $out_trade_no= $_POST['out_trade_no']; //获取订单号 $trade_no= $_POST['trade_no']; //获取支付宝交易号 $total_fee= $_POST['total_fee'];//获取总价格 if($_POST['trade_status'] == 'TRADE_FINISHED' ||$_POST['trade_status'] == 'TRADE_SUCCESS') { //交易成功结束 //判断该笔订单是否在商户网站中已经做过处理(可参考“集成教程”中“3.4返回数据处理”) //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序 //如果有做过处理,不执行商户的业务程序 $arr=include("../Conf/config.php"); @mysql_connect($arr["DB_HOST"].":".$arr["DB_PORT"],$arr["DB_USER"],$arr["DB_PWD"]); @mysql_select_db($arr["DB_NAME"]); $sql="update ".$arr["DB_PREFIX"]."m_order set orderstate=1,paytime='".date('Y-m-d H:i:s')."' where orderid='".$out_trade_no."'"; ``` ``` $verify_result = $alipayNotify->verifyNotify(); if($verify_result) { ``` ``` function verifyNotify(){ if(empty($_POST)) {//判断POST来的数组是否为空 return false; } else { //生成签名结果 $mysign = $this->getMysign($_POST); //获取支付宝远程服务器ATN结果(验证是否是支付宝发来的消息) $responseTxt = 'true'; if (! empty($_POST["notify_id"])) {$responseTxt = $this->getResponse($_POST["notify_id"]);} //写日志记录 //$log_text = "responseTxt=".$responseTxt."\n notify_url_log:sign=".$_POST["sign"]."&mysign=".$mysign.","; //$log_text = $log_text.createLinkString($_POST); //logResult($log_text); //验证 //$responsetTxt的结果不是true,与服务器设置问题、合作身份者ID、notify_id一分钟失效有关 //mysign与sign不等,与安全校验码、请求时的参数格式(如:带自定义参数等)、编码格式有关 if (preg_match("/true$/i",$responseTxt) && $mysign == $_POST["sign"]) { return true; } else { return false; } } ``` 这里有个验证 验证的是我们post的sign 是否与生成的sign相等 生成的是md5的 这里自己生成一个sign 就能通过验证 。 然后直接把$out_trade_no带入查询 造成了注入。 [<img src="https://images.seebug.org/upload/201406/151125371c1a2d8f969a668710dbd439815be072.jpg" alt="c1.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201406/151125371c1a2d8f969a668710dbd439815be072.jpg) —————————————————————————————————————————— 第二处 ``` ali/return_url.php $verify_result = $alipayNotify->verifyReturn(); if($verify_result) {//验证成功 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //请在这里加上商户的业务逻辑程序代码 //——请根据您的业务逻辑来编写程序(以下代码仅作参考)—— //获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表 $out_trade_no= $_GET['out_trade_no'];//获取订单号 $trade_no= $_GET['trade_no'];//获取支付宝交易号 $total_fee= $_GET['total_fee'];//获取总价格 if($_GET['trade_status'] == 'TRADE_FINISHED' || $_GET['trade_status'] == 'TRADE_SUCCESS') { //判断该笔订单是否在商户网站中已经做过处理(可参考“集成教程”中“3.4返回数据处理”) //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序 //如果有做过处理,不执行商户的业务程序 $arr=include("../Conf/config.php"); @mysql_connect($arr["DB_HOST"].":".$arr["DB_PORT"],$arr["DB_USER"],$arr["DB_PWD"]); @mysql_select_db($arr["DB_NAME"]); $sql="update ".$arr["DB_PREFIX"]."m_order set orderstate=1,paytime='".date('Y-m-d H:i:s')."', where orderid='".$out_trade_no."'"; mysql_query($sql); ``` 这里是跟第一处是差不多的。 只是换成了GET。。。 第三处。 alipay/notify_url.php 话说你们这程序 有ali 和 alipay两个目录。 都是支付宝支付的文件。 里面的文件都是一样的, 搞不懂你们。 ``` $alipayNotify = new AlipayNotify($aliapy_config); $verify_result = $alipayNotify->verifyNotify(); if($verify_result) {//验证成功 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //请在这里加上商户的业务逻辑程序代 //——请根据您的业务逻辑来编写程序(以下代码仅作参考)—— //获取支付宝的通知返回参数,可参考技术文档中服务器异步通知参数列表 $out_trade_no= $_POST['out_trade_no']; //获取订单号 $trade_no= $_POST['trade_no']; //获取支付宝交易号 $total_fee= $_POST['total_fee'];//获取总价格 if($_POST['trade_status'] == 'TRADE_FINISHED' ||$_POST['trade_status'] == 'TRADE_SUCCESS') { //交易成功结束 //判断该笔订单是否在商户网站中已经做过处理(可参考“集成教程”中“3.4返回数据处理”) //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序 //如果有做过处理,不执行商户的业务程序 $arr=include("../Conf/config.php"); @mysql_connect($arr["DB_HOST"].":".$arr["DB_PORT"],$arr["DB_USER"],$arr["DB_PWD"]); @mysql_select_db($arr["DB_NAME"]); $sql="select * from ".$arr["DB_PREFIX"]."m_pay where ordernum=".$out_trade_no; ``` 第四处 alipay/return_url.php ``` $verify_result = $alipayNotify->verifyReturn(); if($verify_result) {//验证成功 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //请在这里加上商户的业务逻辑程序代码 //——请根据您的业务逻辑来编写程序(以下代码仅作参考)—— //获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表 $out_trade_no= $_GET['out_trade_no'];//获取订单号 $trade_no= $_GET['trade_no'];//获取支付宝交易号 $total_fee= $_GET['total_fee'];//获取总价格 if($_GET['trade_status'] == 'TRADE_FINISHED' || $_GET['trade_status'] == 'TRADE_SUCCESS') { //判断该笔订单是否在商户网站中已经做过处理(可参考“集成教程”中“3.4返回数据处理”) //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序 //如果有做过处理,不执行商户的业务程序 $arr=include("../Conf/config.php"); @mysql_connect($arr["DB_HOST"].":".$arr["DB_PORT"],$arr["DB_USER"],$arr["DB_PWD"]); @mysql_select_db($arr["DB_NAME"]); $sql="select * from ".$arr["DB_PREFIX"]."m_pay where ordernum=".$out_trade_no; $result=mysql_query($sql); //-------- $rss=mysql_fetch_array($result); if($rss["paystate"]==0) { $sql1="update ".$arr["DB_PREFIX"]."m_pay set trade_no='".$trade_no."',payallmoney=paymoney+payallmoney,gettime='".date('Y-m-d H:i:s')."',paystate=1 where ordernum='".$out_trade_no."'"; mysql_query($sql1); //----- //echo $sql1." "; $sql2="select * from ".$arr["DB_PREFIX"]."m_member where username='".$rss["username"]."'"; ``` [<img src="https://images.seebug.org/upload/201406/15113814b4a4c4dbd72b51d53e850b50d6739346.jpg" alt="c2.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201406/15113814b4a4c4dbd72b51d53e850b50d6739346.jpg) 这个没单引号保护。 而且可以用到下面的update bu多说了。 ### 漏洞证明: 见上面。