0x00
某演唱会的票非常难买,难点在于首先得是粉丝俱乐部年费会员,是年费会员才能抢一个用来抢票的码,用这个码才有资格去票务网上买票。这个艺人的粉丝数量是千万级的,想在那开抢的时候在一堆502里面挤到一点资源,许多人会开个浏览器、多个标签页甚至多台电脑同时提交请求。那么何不让机器帮我们抢呢,因此以下应运而出。
0x01 GreaseMonkey&脚本
第一件事情就是研究一下网页。当时的页面大致是这样的:
用chrome开发者工具(F12)这一前端利器查看网页结构
结果发现抢码按键的执行脚本赫然写在那里
<script type="text/javascript">function surego(area){
if(area == 0){
$("#tips").html('活动暂时关闭');
$("#uurl").html('<a href="/" class="a1">回到首页</a>');
$(".qdtcfr").show().find(".qdtc_c").css({ "margin-top": "-" + $(".qdtc_c").height() / 2 + "px" });
}else{
$.ajax({
type: 'POST',
url: "/sign/getbuycode",
dataType:'json',
data: {'area':area},
beforeSend:function(){
// $("#city").append("<a>loading...</a>");//
},
success:function(re){
if(re.status == 0){
$("#tips").html(re.info);
if(re.title == "去登录"){
$("#uurl").html('<a href="'+re.url+'" class="a1">'+re.title+'</a>');
}else if(re.title == "回到首页"){
$("#uurl").html('<a href="'+re.url+'" class="a1">'+re.title+'</a>');
}else{
$("#uurl").html('<a target="_blank" href="'+re.url+'" class="a1">'+re.title+'</a>');
}
$(".qdtcfr").show().find(".qdtc_c").css({ "margin-top": "-" + $(".qdtc_c").height() / 2 + "px" });
}else{
alert(re.info);
// $("#tips").html(re.info);
// $("#vcode").val(re.code);
// $("#uurl").html('<p class="p5">请保存好该号码,等待永乐通知正式开票时间,凭借此码进行购买!</p>');
}
},
error:function(){
alert("数据加载失败");
}
});
}
}
$(".qdtcfr a.qd_close").click(function () {
$(".qdtcfr").hide();
});
$(".zly_nr3 a").each(function () {
$(this).click(function () {
$(".qdtcfr").show().find(".qdtc_c").css({ "margin-top": "-" + $(".qdtc_c").height() / 2 + "px" });
});
});
$(".qdtc_02 a.a2").click(function () {
$(".qdtcfr").hide();
});
// $(".qdtc_02 a.a1").click(function () {
// $(".qdtcfr").hide();
// });</script>
那么,循环就好喽~
立马改用Firefox打开页面,用油猴来加载我们自动抢码脚本,记得限制一下脚本执行的页面的url,要不然开任何页面都执行,产生的流量就多了。
// ==UserScript==
// @name tfent autogetbuycode
// @namespace AGBC
// @description TO AUTOMATIVELY GET BUYCODE
// @include http://www.tfent.cn/sign/show?id=1
// @version 1
// @grant none
// ==/UserScript==
setInterval(function () {//这个函数就是用来循环的,第一个参数是要执行的函数,第二个参数是每两次执行的间隔时间的毫秒数
$.ajax({
type: 'POST',
url: '/sign/getbuycode',
dataType: 'json',
data: {
'area': 2
}, //改区域码的位置
beforeSend: function () {
// $("#city").append("<a>loading...</a>");//显示加载动画
},
success: function (re) {
if (re.status == 0) {
//alert("Damn it!!!!!!")
return;
} else {
alert(re.info);//成功抢到就弹窗告诉我
// $("#tips").html(re.info);
// $("#vcode").val(re.code);
// $("#uurl").html('<p class="p5">请保存好该号码,等待永乐通知正式开票时间,凭借此码进行购买!</p>');
}
},
error: function () {
//alert("Dick!!!!!!!!!!!!!");
return;
}
});
}, 2000)
把火狐右上角的油猴头点亮,打开抢码页,就可以躺着等成功的弹窗了!
0x02 Intruder attack using Burp Suite
但是,我还是要用另一款神器一起抢,上了这两个保险,心里才踏实嘛!
从脚本中我们可以看到,执行这个脚本是向/sign/getbuycode POST 一些数据
上Burp Suite用Intruder,把area的payload设成许多一样值的字典就行了。注意配置发包的频率,然后就可以右上角开始attack了!
这下终于能安心躺着lol
当时间进入抢码时间时,网络拥塞,基本上都返回502了,一旦有资源给我们提供那一瞬间的服务,就返回200了,就说明我们抢到想要的东西了。
万事俱备,就等时间到了!悄悄说一下,我没敢躺着……
开始抢码了,我就一边盯着Burp期望在一堆502里能出现个200,一边盯着浏览器。终于在一分钟内,浏览器弹窗了,回去Intruder attack看,果然返回了我想要的东西。
查看一下成功应答的包!
去个人中心确认一下: