胡云峰,陈皖芬
(1.文山学院 纪监审处,云南 文山 663000;2.文山州民族职业技术学校,云南 文山 663000)
在当今的互联网时代,人们的工作、生活和网络的联系变得越来越紧密。人们开始习惯于将越来越多的工作放到互联网上完成,其中最常见的就是网络人物投票选举活动。这一类的网络应用为了保证其投票的公平性,大多都是针对投票人所使用的计算机的IP地址进行限制,保证他们在某一特定的时间内只能投设立的票数。针对这个限制,能不能利用什么方法绕开对IP地址以及投票时间的限制,对此类网络投票系统进行刷票呢?
2.1.1 超文本传输协议及HTTP报文
超文本传输协议(又称作HTTP协议)用于在Internet上发送和接收消息,客户端发送一个请求,服务器返回该请求的应答,所有的请求与应答都是HTTP包,HTTP协议使用可靠的TCP连接,默认端口是80。[1]
2.1.2 HTTP请求报文的结构
HTTP请求报文由4部分组成,分别是请求行、报头、空白行和正文。请求行是请求报文中的重要组成部分,它由方法—URL—协议/版本3个部分构成。
WinHTTP的全称是Microsoft Windows HTTP Services, 它提供给开发者一个HTTP客户端应用程序接口(API), 通过这种API借助HTTP协议给其他的HTTP服务器发送请求。由WinHTTP创建的WinHttpRequest.5.1对象,主要应用于客户端向服务器端发送Request请求,在发送请求时,可以模拟构造HTTP请求包的请求标头。[2]
ASPCMS投票系统是网络上免费提供的一款基于ASP与ACCESS数据库的在线投票系统。在测试中,为杜绝用户恶意刷票。在系统后台将“24小时内同IP可投票次数”及“24小时内同IP相同选项可投票数”两个选项都设置为“1”,代表同一IP在24小时内只能投一次票。
利用HTTPWATCH PROFESSIONAL软件对投票过程产生的HTTP数据包进行抓包分析,如图1所示。
图1 ASPCMS投票系统投票过程数据抓取
得到HTTP包数据如下:
“GET /upload/Vote.asp?id=10 HTTP/1.1”表示投票过程利用的是“GET”方式传递数据,数据传递的目的地址是“/upload/Vote.asp”,其中参数“id=10”,表示投票对象是编号为10的人;“Referer: http://localhost/upload/index.asp”表示投票过程的前一个步骤是由“http://localhost/upload/index.asp”产生的。“Accept-Language:zh-cn”表示编码类型;“Host: localhost”表示响应的主机名称。
综合以上关键数据,分析整个投票过程的数据传递后,可利用WinHttpRequest.5.1对象的相关方法,模拟实现浏览器的整个投票过程,以验证利用伪造HTTP报文数据包协议头的方法实现网络刷票的设想是否可行。
利用WinHttpRequest.5.1对象的相关方法,构造测试代码,如下:
执行代码,出现提示:“您已经投票,请稍后再来投票!”。可以看出,程序对同一IP在24小时内的投票数作了限制。
系统利用以下代码验证客户端IP地址:
Request.ServerVariables("HTTP_X_FORWARDED_FOR")表示服务器获取客户端浏览器的代理服务器IP地址,如果获取到的代理服务器IP地址为空,表示客户端浏览器并没有使用代理服务器,在这种情况下,利用Request.ServerVariables("REMOTE_ADDR")获取客户端的真实IP地址。
分析以上代码得出,只要能找到足够多的代理IP地址,就可以实现刷票行为。当今很多网络投票系统刷票程序都是利用大规模地使用代理IP地址实现功能,但是代理服务器经常更新,不能长久使用,也难以找到,所以真正利用代理IP地址进行刷票,很难实现。在测试中,由于仅仅是构造HTTP报文数据包发送数据包,并不是真正地要使用浏览器与服务器进行交互,于是设想在HTTP报文协议头中设置“X-Forwarded-For:XXX.XXX.XXX.XXX”(表示客户端以“XXX.XXX.XXX.XXX”作为IP地址发送数据),看看能不能实现IP地址的伪造。
在测试代码中加入代码:oReq.setRequestHeader "X-Forwarded-For","192.140.130.11" 在协议头里设置报文的发送IP地址(其中“190.140.130.11”这一IP地址是伪造的),运行该代码后,出现了“恭喜您,投票成功,谢谢您的参与!”的提示,说明投票成功。返回前台投票页面,也看到对应的人物票数增加了一票。在测试代码中,我们又随意填写了一些IP地址,对服务器发送数据,最终都可以得到投票成功的提示,至此,验证了伪造协议头进行刷票的方法对本套投票系统有效。
完整刷票代码如下:
在实际应用中,针对ASPCMS网络投票系统,根据用户的需求,如需对某一目标进行大规模的投票,只需在不违反TCP/IP协议的前提下,伪造出足够多的IP地址,即可实现刷票。
[1]谢希仁.计算机网络(第5版)[M].北京:电子工业出版社,2011:243-245.
[2]About WinHTTP[EB/OL].http://msdn.microsoft.com/zh-cn/library/aa392925(v=vs.85).aspx.
[3]吴功宜,吴英.计算机网络技术教程—自顶向下分析与设计方案[M].北京:机械工业出版社,2010:119-126.
[4]快乐笛子.使用WinhttpRequest伪造 Refere [EB/OL].[2010-08-06].Http://www.caizq.com/?type=detail&id=11.