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

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

缺陷编号: WooYun-2014-61133

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

相关厂商: zuitu.com

漏洞作者: ′雨。认证白帽子

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

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

漏洞类型: SQL注射漏洞

危害等级: 高

自评Rank: 20

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

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

Tags标签: 无

3人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

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

code 区域
$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

code 区域
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



code 区域
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



code 区域
$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

厂商回复:

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

最新状态:

暂无


漏洞评价:

对本漏洞信息进行评价,以更好的反馈信息的价值,包括信息客观性,内容是否完整以及是否具备学习价值

漏洞评价(少于3人评价):
登陆后才能进行评分
100%
0%
0%
0%
0%

评价

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

    www.社工库.com

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

    莫名的伤感。

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

    基友求详情

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

    莫名的伤感

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

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

  6. 2014-05-19 19:24 | U神 ( 核心白帽子 | Rank:1360 漏洞数:150 | 乌云核心菜鸟,联盟托管此号中,欢迎加入08...)
    0

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

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

    还有18天高考的路过~

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

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

  9. 2014-05-20 10:16 | 小胖子 认证白帽子 ( 核心白帽子 | Rank:1878 漏洞数:154 | 不要患得患失,我羡慕你,但是我还是选择做...)
    0

    雨 神,有人想给你生孩子

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

    高二狗同顶QAQ

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

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

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

    你才高中……

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

    中国因你们更精彩

  14. 2014-08-13 08:18 | Mr_Java ( 实习白帽子 | Rank:59 漏洞数:19 | 成功进入web端,哈哈!)
    0

    莫名的感伤。

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

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

登录后才能发表评论,请先 登录