最近朋友圈中时不时有人要帮忙投个票啥的,又想起N年前,那时候刚开始学习渗透测试,并且自学java的时候,为了学习代码的同时能够更好的用于实战,想找一些事来做一做。
当时发现一个文学网站有一个为期3个月左右的投票活动,网站活动刚开始就看着最前面的一些作品一下子就获取了1万多票(肯定是专业团队刷的),于是已一个当时屌丝的心态来看,似乎有事做了。哪知道最终我和这个文学网站的投票系统杠上了。
由于是自学java期间,所以没有用一些打包好的jar包,如httpclient等,代码基本都是原生的。
刚开始的时候,测试发现网站的投票功能没有任何限制,于是写了几行代码,直接发送post请求:
看到很多作品的投票数往上涨,心里很是开心。
不过几天后,发现程序似乎失效了,刷了半天,票数似乎没有任何变化,难道有什么变动?
抓包测试了一下,发现似乎请求还是原来的请求,不过似乎只能投票一次了?难道是IP的限制,果断用一个代理IP试了一下,发现又成功了。果然是IP的限制。
一个作品一天只能用一个ip投票一次
于是想着用代理IP,可是平时我也就几个IP翻FQ而已,这几个代理改变不了大局。总不能为了搞个这个,还花钱去买一堆IP吧,不过网上还是有许多的http和sockets的免费代理,有些5分钟更新一次,有些10分钟更新一次,不过这类IP的失效速度挺快的,用于投票还是挺靠谱的。
网上有挺多的代理工具可以自动收集、整理并验证IP是否有效的,只需要输入网页地址就好了,我用的是花刺代理:
最常用的就是添加资源》下载代理资源》验证全部》导出选定,直接导出txt的格式。
然后写代码读取有用的代理IP,默认用http,报错后切换socket代理:
验证码的对抗
不过又过了一段时间,又发现不行了,原来加了验证码,不过验证码很简单,只是纯数字,而且没有啥变形之类的,也就没有弄ocr等等工具,以提高自己为主,于是网上找了一个简单的图形验证码识别代码,了解了解原理,然后改了改做处理:
图形验证码的识别在于字模库,不过我想的也挺简单,他的验证码不复杂,0-9,共10个数字,1个验证码4个数字,准备40张图片,每个数字四张图片对应4个位置,同时网上找了分割代码和二值化的代码来辅助图片处理:
存储图片库设定4个目录,对应4个位置:
一个目录10张图片:
如何比较呢?网上找的一个,应该是一个像素一个像素对比:
当然这种方法是很古老的了,不过可以作为学习者参考使用。
验证码的识别搞定了,接下来就是需要与cookie绑定了,保证验证码图片的获取和投票的请求的cookie一致:
只需要在发送请求中加入
connection.setRequestProperty("Cookie",cookie);
就好了。
几天后,我发现似乎代码又失效了,不过排除原因后,我差点乐了,他们把验证码内容改了,改成汉字的了,而且做了干扰和变形,这样建模的难度就高了,不过我开心的原因就是他们这次的验证码没有满足唯一性和失效性,这也是验证码经常出现问题的地方,也就是使用一次后,不会自动失效,也就导致原来的验证码一直可以使用,不用再去浪费时间刷验证码了。
快乐的时光总是短暂,几天后,似乎他们又发现了什么,验证码又换回去了,不在有验证码的漏洞,而且复杂度提高了,加入了字母在里面,在启用之前的验证码破解方法,已经不行了,而且建模太费时间了,于是就暂时放弃了。
不过我去他们的评论区去发帖,说投个票搞个验证码,太费事了,而且对于专业的刷票团队来说,似乎也没啥鸟用嘛!
登录注册投票
似乎发帖投诉有点作用了,一段时间后,验证码取消了,不过又换成了一个新的方式,投票者需要登录以及注册,注册后需要进行邮箱验证。
不过发现,注册时的邮箱,可以重复使用,主要用户名不重复就好了,这样就不需要搞那么多邮箱了,不过注册的项目挺多的,文学网站,哎!
为了提高真实性,我从百家姓里,把姓氏给提出来,然后随机几个汉字,在长度随机一下,就开始注册了,同时用户名也随机一样,密码与用户名一样,然后就开始批量注册了:
同时把注册的用户名存在一个文件里:之后注册了一些用户之后,就可以了,反正可以重复使用。
再就是自动登录,并获取cookie后进行绑定,不过他们使用登录后投票的功能之后,就没有一个IP只能投一次票的限制了,所以也就暂时不用代理IP了,不过一段时间后,他们又启用了该限制,不过那个时候也差不多快结束了,而且启用代理后,也就多了几行代码而已:
刷代理买火车票
另外值得一提的是,那一年也是网上可以刚开始抢火车票的一年,当时各种插件共享,抢票点击木有问题,问题是,到点了票不出来,几个同事朋友说,这肯定是缓存,哪哪几个城市人少,说不定那快一些,于是又想到了代理IP,但是手动切换浏览器代理IP太费劲了,咋能自动切换呢?
于是当时想到了fiddler,记得一次分享的时候,部门的大神分享了fiddler可以自定义一些功能,于是想,能不能把浏览器指向fiddler,在fiddler中自动代理,而且刷出来了之后,直接关了fiddler就好了,就可以直接买票了,快速方便。
于是找了fiddler的脚本编写的文章,果然有戏,在fiddler的script中,有几个函数:
其中OnBeforeRequest(oSession: Session)的作用就是在请求发送前的一些设置,而代理ip的配置可以如下:
*本文原创作者:ExpLife,本文属FreeBuf原创奖励计划,未经许可禁止转载 oSession["x-overrideGateway"] = "127.0.0.1:8080";
所以就可以设定一个IP数组,然后加一个随机值,自动走其中一个代理IP就好了。