参加了一次夜跑活动,比赛完顺便给自己刷了下票


又名:游侠客的程序员,能不能用点心

上周交了9块钱报名参加了游侠客组织的武汉荧光夜跑活动。我跑步有一年了,基本上是一个人在跑。这次参加活动,也是第一次参加活动,感觉挺不错的。

五六百人参赛,文化衫和脸上的涂鸦,彩色的荧光棒,活泼的妹子们,现场气氛很不错!

参加了一次夜跑活动,比赛完顺便给自己刷了下票

起跑前:

参加了一次夜跑活动,比赛完顺便给自己刷了下票

我在挤到了四五排的位置:

参加了一次夜跑活动,比赛完顺便给自己刷了下票

五公里健康跑,我拼了老命,以第十名到达终点(那个唯一没看镜头的就是我):

参加了一次夜跑活动,比赛完顺便给自己刷了下票

但实际上这是一场自拍比赛:跑步是不设奖项的,现场拍照上传,然后投票评比才有奖品。反正我也喜欢拍照,就也上传了,并分享了朋友圈看能不能拉到票。

重点来了。朋友说投票需要输入手机号,然后获取验证码才能进入投票页面。我也有给别人投票的经验,但是填验证码投票的,还没见过。但跑步太拼了,就早休息了。

第二天起床,想看看能不能给自己加点人气,于是不抱任何希望的打开了chrome,debug一下投票网页:

参加了一次夜跑活动,比赛完顺便给自己刷了下票

点击投票后给了我这个页面:

参加了一次夜跑活动,比赛完顺便给自己刷了下票

做过微信,明白这个是微信页面的限制,于是我从PC微信打开了该页面。为了看看到底页面发了个什么请求,立马下载了fiddler(黑客技术真不会,fiddler基本操作还是会的)。

点击投票时,页面发送了一个GET请求(是的,GET请求):

参加了一次夜跑活动,比赛完顺便给自己刷了下票

参加了一次夜跑活动,比赛完顺便给自己刷了下票

该请求只有两个参数,uid和pid。随便给其他几个人投票,观察了下,就知道uid是投票人id,pid是被投票人id。

于是进入我自己的投票页面,找到自己的pid,再进入另外一个人的投票页面,找到他的pid,作为给我投票的uid,这样就能完成他给我投票的过程了。

拼了一个URL,往chrome地址栏一放,回头看看我的票数就加了一个。再刷新一下,哦,告诉我已经投过了不能重复投。

好奇的尝试了下,uid不使用别人的pid,而随便用个数字呢?意外的发现,随意一个数字都能投票!

这样就简单的有点过分了,IP,id,跨域,请求间隔都没有做限制。简单一个脚本,随意在哪个页面上一跑,想拿什么奖都可以了。

function vote (targetId) {
  let image = new Image()
    let uid = Date.now()
  image.src = `http://m.youxiake.com/h5/run_vote?uid=${uid}&pid=${targetId}`
}

回头看看那个输入手机号获取验证码才能投票的限制… 游侠客的程序员们,能不能用点心

参加了一次夜跑活动,比赛完顺便给自己刷了下票

不敢给自己刷第一名,对第一名奖品也没兴趣。但是我对“土豪大礼包”还是很好奇的。那就维持下自己第5到10名的排名吧。


发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>