56网100000话费活动页面漏洞分析

最近从童鞋那边听说56网搞起送话费和公仔的一个活动..可悲的是56网的营销策划真是非常滴糟糕,这个活动没多少人知道和参加.不过目测到现在逐渐参加活动的人也多起来了…..但是很糟糕的56网的工程师们真是做活儿不认真啊…这么明显的一个刷分bug竟然就爆现了.

好了废话不多说.来分析一下页面的情况

首先活动主页是:http://huodong.56.com/2012/videoPrize/index.php

 

 

 

 

 

按照活动正常流程,是用户登录账户结束之后,在观看若干个视频的时候随机出现大礼包图片链接,从该链接处每次随机获取10 20 30 50不等的积分.

我们获取到礼包地址来分析一下看看

第一个礼包:http://huodong.56.com/2012/videoPrize/index.php?vid=XXXXX0ODQXXXXX&ts=1340686300&token=XXccae7c5XXXX12468da2cXXXX70

第二个礼包:http://huodong.56.com/2012/videoPrize/index.php?vid=XXXXXMjA1XXXXX&ts=1340686226&token=cXXXX317db0387eXXXXc9a7XXXX4

对比分析一下传给后台的几个变量,vid ts token表意都非常明显(其中的XXXX以示隐藏部分内容,大家忽略,复制此地址也无效)

 

继续看页面js,注意到一个取奖品function.

function getPrize(obj,pt_id,p_index){
var pli_time = $(“#exchange ul.time_line li.current”).attr(“val_time”);
$.ajax({
type : “post”,
dataType : “json”,
data : {“pt_id”:pt_id, “p_index”:p_index, “pli_time”:pli_time},
url : “index.php?do=getPrize”,
beforeSend : function(){
$(obj).html(“兑换中…”);
$(obj).attr(“disabled”,”disabled”);
},
success : function(data){
if(data === 1){
window.location.href=”index.php?do=getPrizeSuccess”;
}
else if(data === 0 || data === 4){
window.location.href=”index.php?do=getPrizeFail”;
}
else if(data === 2){
alert(‘请先登录再兑换’);
return false;
}
else if(data === 3){
alert(‘您的积分不够’);
return false;
}
}
})
}

 

分析代码,实在是写着弱爆了,通过jason往后台传递pt_id p_index pli_time等三个参数

其一pt_id为奖品id每个时间点不同, p_index为该时段的一号or二号奖品 pli_time取自#exchange内li的val_time参数值.

再找出后台兑换地址为http://huodong.56.com/2012/videoPrize/index.php?do=getPrize

返回值分析

返回data = 1兑换成功

返回data = 0或4兑换失败(猜测0为数量兑换完毕4为时间未到)

data = 2 为用户未登录

data = 3 积分不足

其中兑换成功则跳到网址:http://huodong.56.com/2012/videoPrize/index.php?do=getPrizeSuccess

增对do变量也可以做很多事情,这个变量再未命名时候返回的[0,0,”method not exists”],又一大问题…暴露了部分错误信息,而且返回的0,0两个参数位置可以针对进行猜解.这里木有继续深入下去.

 

接下来从积分获取方式中分析可得.后台不验证上述的vid ts token,估计vid ts token只做入库记录并且不检查时间是否与当前时间相符,所以爆出刷分漏洞,打开上述两个地址之后轮流进行刷新结果发现积分依旧可以进行重复累加,得出结论后台只验证两次的时间是否相同,如果不相同就进行积分累加.

因此利用这个漏洞,在两个地址直接轮流刷新,积分一就一个劲暴涨了.

 

接下来更劲爆的是还能不在对应的时间点提交兑换礼品的请求.

用firebug看到开始兑换的按钮处的代码为 <a onclick=”getPrize(this,’22’,’2′)”>开始兑换</a>

分析function getPrize可知若改变传递的第二个礼品id参数,23 24 25就可以直接兑换到下一时段要开始才能兑换的礼品了.照这个思路去改了一下测试,果真可以兑换成功,查询兑奖记录显示礼品已经兑换得到.

 

 

综述,56网的这次活动程序要么是临时工做的要么是初出茅庐的工程师的练手作品…不过bug暴露的如此明显也比较无语了…js html里面的注释你上线后怎么样也记得删掉去一下好吧…不然真的暴露出来给外人提供了很多的方便.希望56滴工程师们多多注意…

Read More