### 简要描述:
来了个新厂商。 挖一下把。
开放+封闭源代码
封闭源代码,普通用户使用加密后的代码,付费用户使用开放的源代码,使商城更安全
对于我这种屌丝只能用免费版 就是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多说了。
### 漏洞证明:
见上面。
暂无评论