在51CTO传媒推出“2011年IT博客大赛”后,我也很“关注”,继而也尝试着参加了。
其实我写blog是为了让别人得到一定的技术支持,同时也提高自己的写作水平和学习的扎实度。看了一下“2011年IT博客大赛”的首页和选手的参赛网址,发现有各个选手的blog连接,感觉这是个宣传自己的好机会。怎样达到良好的宣传效果呢?当然是增加投票数目和提升排名了!
因为自己所学专业方面的优势,很快就发现了投票系统的一个漏洞bug。
首先,我认真阅读了“2011年IT博客大赛”的章程,发现如下内容:
IT博客大赛十大杰出IT博客及IT博客50强评选规则:
1、网络投票规则
1)投票用户无需注册;
2)每位网友每天限投10票,当天不能重复投给同一参赛者;
既然是游客可以投票,那么肯定可以有所利用。所以我就进行了投票测试,退出了当前登陆。果然如规则所描述的,游客是可以投票的。但是如何能得到更多的投票机会呢?
我猜测这个是网页的脚本设计出的功能,因此首先我查看了此网页的源代码。
摘录如下:
<!--这是来自http://blog.51cto.com/contest2011/1539422的页面源代
<li><a href="javascript:void(0);" class="vote" rel="1539422"> <img src="http://blog.51cto.com/contest2011/images/gr_tp.jpg" width="98" height="34" /></a></li>认真查看了第二行的脚本文件。 摘录其中的投票部分如下:
function votesubmit(v,m,f){ if (v == 'yes') { an = m.children('#seccode'); if(f.bseccode == ""){ alert('请输入验证码!'); return false; } $.post(baseurl + "/index.php?mod=vote", {bseccode:f.bseccode,vuid: f.vuid}, function(data){ if (data.status == 1) { alert('投票成功'); // $('#vote'+f.vuid).html(data.data + ' 票'); $('.votenum'+f.vuid).html(data.data); } else if (data.status == '-4') { alert('验证码错误!'); return false; } else if (data.status == '-5') { alert('投票有异常哦,不符合投票规定吧?'); } else if (data.status == '0') { alert('投票失败,请稍候再试!'); } else { alert(data); } $.prompt.close(); }, 'json'); return false; } else if (v == 'no') { return true; } }虽然我对java脚本和PHP语言并不熟悉,但我还是找到了我感兴趣的敏感词汇,“vuid”、“centent”等。
因为这些我在以前学习操作系统接触web服务器时在cookies的相关内容中似乎见到过类似的内容。因为cookies的一大功能就是记录客户端的信息(稍后我会对Cookies进行一些描述)。
感兴趣的话,可以打开cookies或者借助浏览器查看cookies的内容,我敢保证你肯定会骂cookies的(你骂cookies好了,因为就算是网络程序员也没有办法),后面将继续介绍。
紧接着,我又查看了第三行对应的脚本内容,发现如下内容:/* * jQuery Impromptu * By: Trent Richardson [http://trentrichardson.com] * Version 3.1 * Last Modified: 3/30/2010 * * Copyright 2010 Trent Richardson * Dual licensed under the MIT and GPL licenses. * http://trentrichardson.com/Impromptu/GPL-LICENSE.txt * http://trentrichardson.com/Impromptu/MIT-LICENSE.txt * */这个看起来似乎是一套“软件”,更确切地说应该是套插件,我按照联系方式去查看了一下相关的网页, 发现了与计(数)时器功能类似的词语,如datetime和timerpicker这样的词语。
这样更加证实了我以上的想法。 因此我进行假设,如果满足以下条件则投票系统必然不会以为这是个false投票。 1.变更IP地址。这个恐怕死任何一个人都可能想到的,因为IP这个独特的机制肯定会被绝大多数web投票系统所利用。 一般来说,投票系统会在一段时间内把投票过的IP地址交付给数据库存放,当再次有投票请求时就会核对是否是以往投过票的IP。 2.当前cookies并没有记录。因为我后来想到cookies这个可恶的死虫子可能记录下与我有关的信息,所以我后来才使用清除cookies的方法。后来我也被证实这种方法的必要性。
补充:
Cookies的作用 | 如何禁用cookies | 如何清除cookies请参阅维基百科。
3.考虑网卡信息和浏览器的特征性信息。 针对IP地址,我首先想到了DHCP服务器。这个其实我已经在我的一篇博客文章中提到过了,详情参见我的文章,名称是《 关于DHCP——一些你可能不知道的东西 》。 使用路由器,断开WAN口连接,再进行连接的这个方法是最简单、最凑效的。 注意这里有个要点:IP必须是公网IP地址,私有IP地址无论如何改变都是不能做到以上的需求的。
不过,这个方法有种弊端,那就是可能导致你使用的IP地址只是在一个固定的范围内跳动,如在一个子网内。 所以,不妨使用IP代理的方法,可以非常有效的“伪装”IP地址。
针对cookies,我首先并没有拒绝我的浏览器允许使用它,而是试着清除掉所有包含“51cto”字符的cookies记录。
如果完全禁用cookies恐怕,就会得到最好的效果。因为,你不知道管理员是否会把记录cookies的关键字改掉,改为google、microsoft或者cisco你就不知道了。
像这样的cookies你是不是感到很愤怒呢?
针对第三种,我考虑了半天,虽然有效,但是不太可行。后来我觉得我有必要利用我借助Oracle VM搭建的虚拟机。 虽然也凑效,但是由于IP地址的特性还是需要借助路由器实现IP的变更。 其实,要想做到这一点还可以借助一些专门的软件,比如借助第三方投票软件。 但是这个方法我没有使用,因为这几乎太难了,无论是获得它还是使用它。甚至它能给我带来危险。
最后在此特别声明:
51CTO IT博客大赛声明第一条“严禁任何恶意作弊行为,发现可疑情况组委会将组织调查,一经证实该选手将被取消参赛资格。”组委会将不定期进行检查和处理。
本文章仅仅用于报告bug,请自觉做到不要使用其中的内容应用到任何投票系统。
如果你发现存在其他bug,请告知51CTO网络管理员,电子邮件为:shaoyan@51cto.com。
本文转自 urey_pp 51CTO博客,原文链接:http://blog.51cto.com/dgd2010/717410,如需转载请自行联系原作者