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

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

缺陷编号:wooyun-2014-061133

漏洞标题:最土团购注入两处 (直接提升自己权限)

相关厂商:zuitu.com

漏洞作者: ′雨。

提交时间:2014-05-17 20:33

修复时间:2014-08-12 20:34

公开时间:2014-08-12 20:34

漏洞类型:SQL注射漏洞

危害等级:高

自评Rank:20

漏洞状态:漏洞已经通知厂商但是厂商忽略漏洞

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2014-05-17: 细节已通知厂商并且等待厂商处理中
2014-05-19: 厂商主动忽略漏洞,细节向第三方安全合作伙伴开放
2014-07-13: 细节向核心白帽子及相关领域专家公开
2014-07-23: 细节向普通白帽子公开
2014-08-02: 细节向实习白帽子公开
2014-08-12: 细节向公众公开

简要描述:

又是周末。
还有一个多月就要高考了, 到时候我也就成了高三狗了。
荒废了这前面的两年, 决定高三的时候还是得拼一下。
希望能考上个自己理想的学校。

详细说明:

上次说了chinabank 把剩下的几个文件都报出来把。
主要是通过验证的问题。 执行语句的时候会转义得找没单引号的地方。
一些我没办法通过那验证,
还有一些就是把amount/100了 例如bill/return.php中的
$v_amount = ($orderAmount/100);
这个我也没办法利用了。
把能利用的写出来一下。
0x01 order/sdopay/notify.php

$amount=$_POST["Amount"];
$payamount=$_POST["PayAmount"];
$orderid=$_POST["OrderNo"];
$serialno=$_POST["serialno"];
$status=$_POST["Status"];
$merid=$_POST["MerchantNo"];
$paychannel=$_POST["PayChannel"];
$discount=$_POST["Discount"];
$signtype=$_POST["SignType"];
$paytime=$_POST["PayTime"];
$ctype=$_POST["CurrencyType"];
$prono=$_POST["ProductNo"];
$prodesc=$_POST["ProductDesc"];
$remark1=$_POST["Remark1"];
$remark2=$_POST["Remark2"];
$ex=$_POST["ExInfo"];
$mac=$_POST["MAC"];
$signString=$amount."|".$payamount."|".$orderid."|".$serialno."|".$status."|".$merid."|".$paychannel."|".$discount."|".$signtype."|".$paytime."|".$ctype."|".$prono."|".$prodesc."|".$remark1."|".$remark2."|".$ex;
if($signtype=="2")//md5
{
$md5key=$INI['sdopay']['sec'];
$mac2 =md5($signString."|".$md5key);
$ok = (strtoupper($mac)==strtoupper($mac2));
}
@list($_, $order_id, $city_id, $_) = explode('-', $orderid, 4);
if (Table::Fetch('pay', $orderid)) die('OK');
if ( $_ == 'charge' ) {
if ($ok == 1) {
@list($_, $user_id, $create_time, $_) = explode('-', $orderid, 4);
ZFlow::CreateFromCharge($amount, $user_id, $create_time, 'sdopay',$serialno);

die("OK");//必须输出且只能输出"OK"
}
}


这里 主要是让 $ok 为 1

if($signtype=="2")//md5
{
$md5key=$INI['sdopay']['sec'];
$mac2 =md5($signString."|".$md5key);
$ok = (strtoupper($mac)==strtoupper($mac2));
}


首先让signtype为2
mac2 $signString | $md5key 这里md5key默认都为空的 不用考虑。
$mac为post来的 只要$mac和$mac2相等 就能让$ok为1

static public function CreateFromCharge($money,$user_id,$time,$service='alipay',$trade_no=''){
global $option_service;
if (!$money || !$user_id || !$time) return 0;
$pay_id = "charge-{$user_id}-{$time}";
$pay = Table::Fetch('pay', $pay_id);
if ( $pay ) return 0;

$order_id = ZOrder::CreateFromCharge($money,$user_id,$time,$service);
if (!$order_id) return 0;
//insert pay record
$pay = array(
'id' => $pay_id,
'vid' => $trade_no,
'order_id' => $order_id,
'bank' => $option_service[$service],
'currency' => 'CNY',
'money' => $money,
'service' => $service,
'create_time' => $time,
);
DB::Insert('pay', $pay);
ZCredit::Charge($user_id, $money);
//end//
//update user money;

$user = Table::Fetch('user', $user_id);

Table::UpdateCache('user', $user_id, array(
'money' => array( "money + {$money}" ),
));


这里$amount 做的$money 可以看到没有被单引号 没有intval。
而且直接update的是user table 。 且可控的是在set位。。
管理和用户都是在user表里。 通过manager column 来判断是否为管理。
这里直接update manager 为1 就能直接提升自己为管理。
_________________________________________________________________________
0x02 order/gopay/return.php

$tranCode = $_REQUEST["tranCode"];
$merchantID = $_REQUEST["merchantID"];
$merOrderNum = $_REQUEST["merOrderNum"];
$tranAmt = $_REQUEST["tranAmt"];
$ticketAmt = $_REQUEST["ticketAmt"];
$tranDateTime = $_REQUEST["tranDateTime"];
$currencyType = $_REQUEST["currencyType"];
$merURL = $_REQUEST["merURL"];
$customerEMail = $_REQUEST["customerEMail"];
$authID = $_REQUEST["authID"];
$orgOrderNum = $_REQUEST["orgOrderNum"];
$orgtranDateTime = $_REQUEST["orgtranDateTime"];
$orgtranAmt = $_REQUEST["orgtranAmt"];
$orgTxnType = $_REQUEST["orgTxnType"];
$orgTxnStat = $_REQUEST["orgTxnStat"];
$msgExt = $_REQUEST["msgExt"];
$virCardNo = $_REQUEST["virCardNo"];
$virCardNoIn = $_REQUEST["virCardNoIn"];
$tranIP = $_REQUEST["tranIP"];
$isLocked = $_REQUEST["isLocked"];
$feeAmt = $_REQUEST["feeAmt"];
$respCode = $_REQUEST["respCode"];
$VerficationCode = $INI['gopay']['code'];
$signValue = $_REQUEST["signValue"];
$orderId = preg_replace('/_/', '-', $merOrderNum);
$str = "tranCode=[$tranCode]merchantID=[$merchantID]merOrderNum=[$merOrderNum]tranAmt=[$tranAmt]ticketAmt=[$ticketAmt]tranDateTime=[$tranDateTime]currencyType=[$currencyType]merURL=[$merURL]customerEMail=[$customerEMail]authID=[$authID]orgOrderNum=[$orgOrderNum]orgtranDateTime=[$orgtranDateTime]orgtranAmt=[$orgtranAmt]orgTxnType=[$orgTxnType]orgTxnStat=[$orgTxnStat]msgExt=[$msgExt]virCardNo=[$virCardNo]virCardNoIn=[$virCardNoIn]tranIP=[$tranIP]isLocked=[$isLocked]feeAmt=[$feeAmt]respCode=[$respCode]VerficationCode=[$VerficationCode]";
$newSign = MD5($str);
@list($_, $order_id, $city_id, $_) = explode('-', $orderId, 4);
if (Table::Fetch('pay', $orderId)) die('SUCCESS');
if( $newSign == $signValue && $respCode == '0000' ) {
/* charge */
if ( $_ == 'charge' ) {
@list($_, $user_id, $create_time, $_) = explode('-', $orderId, 4);
ZFlow::CreateFromCharge($tranAmt, $user_id, $create_time, 'gopay',$tranCode);
Session::Set('notice', "国付宝充值{$tranAmt}元成功!");


这里验证了
$newSign == $signValue && $respCode == '0000'
$newSign 又是Md5来的。 所以能通过验证了。。
ZFlow::CreateFromCharge($tranAmt 然后又进这函数 不多说了。
_________________________________________________________________

漏洞证明:

第一处

z2.jpg


第二处

z3.jpg


update。

z4.jpg


修复方案:

intval money
加强验证。

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


漏洞回应

厂商回应:

危害等级:无影响厂商忽略

忽略时间:2014-08-12 20:34

厂商回复:

此产品已不再维护,原站已经下线,感谢白帽子提交漏洞,中国因你们更精彩

最新状态:

暂无


漏洞评价:

评论

  1. 2014-05-17 20:36 | GDH ( 路人 | Rank:2 漏洞数:1 | 谢谢大家对我的支持!)

    www.社工库.com

  2. 2014-05-17 20:36 | ′ 雨。 ( 普通白帽子 | Rank:1231 漏洞数:190 | Only Code Never Lie To Me.)

    莫名的伤感。

  3. 2014-05-18 07:09 | Cougar ( 实习白帽子 | Rank:69 漏洞数:19 | 不容易。)

    基友求详情

  4. 2014-05-19 17:06 | xsser 认证白帽子 ( 普通白帽子 | Rank:254 漏洞数:18 | 当我又回首一切,这个世界会好吗?)

    莫名的伤感

  5. 2014-05-19 17:18 | xfkxfk 认证白帽子 ( 核心白帽子 | Rank:2179 漏洞数:338 | 呵呵!)

    “此产品已不再维护,原站已经下线,感谢白帽子提交漏洞,中国因你们更精彩“——挺住~

  6. 2014-05-19 19:24 | U神 ( 核心白帽子 | Rank:1285 漏洞数:142 | 感谢乌云,知恩不忘,其实我一直都在乌云默...)

    大神!你这是在刷人民币啊!

  7. 2014-05-19 20:03 | 郭斯特 ( 普通白帽子 | Rank:181 漏洞数:69 | GhostWin)

    还有18天高考的路过~

  8. 2014-05-19 23:42 | Mody ( 普通白帽子 | Rank:110 漏洞数:27 | "><img src=x onerror=alert(1);> <img s...)

    尼玛,你居然是高中生,碉堡了

  9. 2014-05-20 10:16 | 小胖子 认证白帽子 ( 核心白帽子 | Rank:1727 漏洞数:140 | 如果大海能够带走我的矮丑...)

    雨 神,有人想给你生孩子

  10. 2014-05-20 22:07 | 橘子 ( 路人 | Rank:0 漏洞数:3 | 呢个...羞射高中生一枚。带上大神@Haswell...)

    高二狗同顶QAQ

  11. 2014-06-05 21:35 | piaoye ( 普通白帽子 | Rank:343 漏洞数:53 | ww)

    漏洞最土团购注入两处 (直接提升自己权限)已经对你公开了,可以提前去看看

  12. 2014-08-12 22:22 | 铁汉 ( 路人 | Rank:12 漏洞数:6 | 向各种大神学习之)

    你才高中……

  13. 2014-08-13 00:24 | Calify ( 路人 | Rank:7 漏洞数:5 | 未能联系到厂商或者厂商积极拒绝)

    中国因你们更精彩

  14. 2014-08-13 08:18 | Mr_Java ( 路人 | Rank:28 漏洞数:9 | 成功进入web端,哈哈!)

    莫名的感伤。

  15. 2014-08-13 10:48 | gddhggf ( 路人 | Rank:2 漏洞数:1 | 来学习的)

    自评rank20,结果最后给忽略了,只是多么大的心里落差。。厂商还来一句:中国因你们更精彩。厂商又调皮了。。