当前位置:WooYun >> 漏洞信息

漏洞概要 关注数(24) 关注此漏洞

缺陷编号:wooyun-2014-065006

漏洞标题:CUUMALL 注入 5-8

相关厂商:cuumall.com

漏洞作者: ′雨。

提交时间:2014-06-17 14:57

修复时间:2014-09-15 14:58

公开时间:2014-09-15 14:58

漏洞类型:SQL注射漏洞

危害等级:高

自评Rank:20

漏洞状态:厂商已经确认

漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 [email protected]

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2014-06-17: 细节已通知厂商并且等待厂商处理中
2014-06-17: 厂商已经确认,细节仅向厂商公开
2014-06-20: 细节向第三方安全合作伙伴开放
2014-08-11: 细节向核心白帽子及相关领域专家公开
2014-08-21: 细节向普通白帽子公开
2014-08-31: 细节向实习白帽子公开
2014-09-15: 细节向公众公开

简要描述:

来了个新厂商。 挖一下把。

开放+封闭源代码
封闭源代码,普通用户使用加密后的代码,付费用户使用开放的源代码,使商城更安全
对于我这种屌丝只能用免费版 就是zend后的代码。
不过还是有几个文件没zend。 就只看这几个文件了。

详细说明:

第五处
kuaiqian/receive_mall.php中

$dealTime=trim($_REQUEST['dealTime']);
//获取实际支付金额
///单位为分
///比方 2 ,代表0.02元
$payAmount=trim($_REQUEST['payAmount']);
//获取交易手续费
///单位为分
///比方 2 ,代表0.02元
$fee=trim($_REQUEST['fee']);
//获取扩展字段1
$ext1=trim($_REQUEST['ext1']);
//获取扩展字段2
$ext2=trim($_REQUEST['ext2']);
//获取处理结果
///10代表 成功; 11代表 失败
///00代表 下订单成功(仅对电话银行支付订单返回);01代表 下订单失败(仅对电话银行支付订单返回)
$payResult=trim($_REQUEST['payResult']);
//获取错误代码
///详细见文档错误代码列表
$errCode=trim($_REQUEST['errCode']);
//获取加密签名串
$signMsg=trim($_REQUEST['signMsg']);
//生成加密串。必须保持如下顺序。
$merchantSignMsgVal=appendParam($merchantSignMsgVal,"merchantAcctId",$merchantAcctId);
$merchantSignMsgVal=appendParam($merchantSignMsgVal,"version",$version);
$merchantSignMsgVal=appendParam($merchantSignMsgVal,"language",$language);
$merchantSignMsgVal=appendParam($merchantSignMsgVal,"signType",$signType);
$merchantSignMsgVal=appendParam($merchantSignMsgVal,"payType",$payType);
$merchantSignMsgVal=appendParam($merchantSignMsgVal,"bankId",$bankId);
$merchantSignMsgVal=appendParam($merchantSignMsgVal,"orderId",$orderId);
$merchantSignMsgVal=appendParam($merchantSignMsgVal,"orderTime",$orderTime);
$merchantSignMsgVal=appendParam($merchantSignMsgVal,"orderAmount",$orderAmount);
$merchantSignMsgVal=appendParam($merchantSignMsgVal,"dealId",$dealId);
$merchantSignMsgVal=appendParam($merchantSignMsgVal,"bankDealId",$bankDealId);
$merchantSignMsgVal=appendParam($merchantSignMsgVal,"dealTime",$dealTime);
$merchantSignMsgVal=appendParam($merchantSignMsgVal,"payAmount",$payAmount);
$merchantSignMsgVal=appendParam($merchantSignMsgVal,"fee",$fee);
$merchantSignMsgVal=appendParam($merchantSignMsgVal,"ext1",$ext1);
$merchantSignMsgVal=appendParam($merchantSignMsgVal,"ext2",$ext2);
$merchantSignMsgVal=appendParam($merchantSignMsgVal,"payResult",$payResult);
$merchantSignMsgVal=appendParam($merchantSignMsgVal,"errCode",$errCode);
$merchantSignMsgVal=appendParam($merchantSignMsgVal,"key",$key);
$merchantSignMsg= md5($merchantSignMsgVal);
//echo $merchantSignMsg;
//初始化结果及地址
$rtnOk=0;
$rtnUrl="";
define("_UL_", $_SERVER['SERVER_NAME']);
//商家进行数据处理,并跳转会商家显示支付结果的页面
///首先进行签名字符串验证
if(strtoupper($signMsg)==strtoupper($merchantSignMsg)){
switch($payResult){

case "10":

/*
' 商户网站逻辑处理,比方更新订单支付状态为成功
' 特别注意:只有strtoupper($signMsg)==strtoupper($merchantSignMsg),且payResult=10,才表示支付成功!
*/

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_pay set paystate=1,trade_no='".$dealId."',payallmoney=payallmoney+paymoney,gettime='".date('Y-m-d H:i:s')."' where ordernum='".$orderId."'";
mysql_query($sql);
$sql3="select * from ".$arr["DB_PREFIX"]."m_pay where ordernum='".$orderId."'";
$result=mysql_query($sql3);
$rs=mysql_fetch_array($result);
$sql2="update ".$arr["DB_PREFIX"]."m_member set money=money+".$rs["paymoney"]." where username='".$rs["username"]."'";
mysql_query($sql2);


这个又是只验证了一下md5。。

c3.jpg


—————————————————————————————————————————
第六处
kuaiqian/receive_store.php中
跟第五处一样的。
不多说了。
__________________________________________________________________________
第七处
在tenpay/return_url.php中

$resHandler = new PayResponseHandler();
$resHandler->setKey($key);
//判断签名
if($resHandler->isTenpaySign()) {

//交易单号
$transaction_id = $resHandler->getParameter("transaction_id");

//金额,以分为单位
$total_fee = $resHandler->getParameter("total_fee");

//支付结果
$pay_result = $resHandler->getParameter("pay_result");

//商户交易号
$sp_billno=$resHandler->getParameter("sp_billno");

if( "0" == $pay_result ) {

//------------------------------
//处理业务开始
//------------------------------
@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=".$sp_billno;
$result=mysql_query($sql);
//--------
$rss=mysql_fetch_array($result);
if($rss["paystate"]==0)
{
$sql1="update ".$arr["DB_PREFIX"]."m_pay set trade_no='".$transaction_id."',payallmoney=paymoney+payallmoney,gettime='".date('Y-m-d H:i:s')."',paystate=1 where ordernum='".$sp_billno."'";
mysql_query($sql1);
//-----


用了个函数来验证 这个函数跟之前 验证alipay的那个基本一样。
第八处 tenpay/return_stor_url.php

c4.jpg

漏洞证明:

见上面。

修复方案:

对这些intval一次把。

版权声明:转载请注明来源 ′雨。@乌云


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:20

确认时间:2014-06-17 15:31

厂商回复:

你上次提交的1-4和这个是一个类型的,都是支付接口没有添加禁用代码的问题,上次那个问题在这里补偿你了:)

最新状态:

暂无