现在很多投票程序用了IP判断你投票了没有,如果此IP投过票就记录到数据库里,不能再投。这里就涉及到一个用户IP地址获取的问题。一般你刷票,首先会想到挂多个代理让服务器以为这是多个不同的用户访问。其实关于IP地址的获取,不论是nginx和apache都是有一定缺陷的,如果网站主没有特意配置,你程序获取到的IP是可以通过修改HTTP包来伪造的。某些大型网站(比如知乎的反爬虫),可能会特别对IP地址进行甄别,从而你不得不挂代理,但是绝大部分小型网站都很容易通过改包来伪造IP从而达到你的目的。
某wordpress网站有一个投票的地方:
(我知道你会问我,我投的是反对票…)
投票之后清理cookie后还是不能再投,那么这就是一个典型的PHP程序通过取得用户IP来判断用户是否投票的例子。我抓包,发现使用了WP-Polls插件:
(↑第一次投票)
(↑第二次投票)
于是我下载了WP-Polls的插件包,在wp-polls.php文件中看到了获取IP的相关代码:
其实大部分web程序的IP获取原理都和这个插件差不多:依次枚举图中的几个$_SERVER项的值,如果有一个取到了就直接返回IP,不考虑后面的值。
下面列出HTTP包中对IP地址描述的几个项:
X-Forwarded-For
Client-IP
x-remote-IP
x-originating-IP
x-remote-addr
图片中的HTTP_CLIENT_IP对应到http包中就是Client-IP
,是可以伪造的。
放到burp里面改包发送试试:
OK,那么我的思路就是生成一大堆虚拟IP,替换到包里面,然后用burp刷票。
下面看图:
关于burp intruder的教程可见:https://dfkan.com/961.html
现在start attack:
然后我发现burp自动把“.”字符URL编码了…
解决这个问题只要把自动URL编码去掉就行了:
现在再次开始:
~A few moments later~
OK,我党阵营已经反败为胜了~哈哈~
只要超过赞成票就行了,还是不要刷太多,容易被发现。