应对服务器端访问限制的一些办法(Cookie,Session,IP等)

这两天看到两篇文章,关于IP欺骗的,实现的方式一个是修改HTTP头,一个是重复拨号的方式。在这方面,贫道有一点经验。不要鄙视贫道,大概5年前,还是大三大四的时候,帮朋友搞私服。在当时的一些论坛上宣传,做了自动发贴、跟帖的机器人。当时对TCP/IP理解还不深刻,在写自动注册模块的时候,用了代理服务器的方式防止网管发现注册帐号都是一个IP的。后来也写过一些自动投票之类的工具。

如果服务器对访问做限制,大致分为以下几种情况:

1、使用Cookies或者Session来限制;
2、基于注册帐号的限制;
3、验证码限制。
4、在缓存模块记录IP限制;
5、数据库记录IP限制;

 

下面就以上几种情况分别讨论,以一个投票系统为例子。

一、突破Cookies或者Session限制
1.浏览器打开网页,然后投票,
2.关闭浏览器,
3.清空Cookies,
4.重复以上步骤。

按照以上步骤可以人工地进行投票,这种限制等于没有。当然,如果会编程的话,无论哪种语言都可以写个机器人。用.Net类库中包装好的HttpWebRequest为例,不给HttpWebRequest设置CookiesContainer的话,Cookie和Session的限制就无效了。看看,这种方式轻易就解决问题了。甚至用浏览器打开网页,用Javascript就可以做到。

二、突破注册帐号限制
这种方式人工处理的办法没什么可行性,太费劲了,除非雇员上一批人来操作。好像目前淘宝的一些网店推销就是采用的这种方式,嘿嘿,在网上招募发贴人,我记得在央视新闻频道还看到过这方面的报道,还有个牛人靠发贴(应该是写软文),月入10K的。当然,人家干的是技术活,写的文章好,写得不好估计没人看的。

 跑题了,下面讲讲体力活。体力活的话,还是程序员来做吧。写个程序自动注册帐号,自动发贴,处理一些网站论坛的发贴模式也很容易解决。当然前提是注册没有什么邮件验证啊、注册码之类的限制。如果邮件验证还好办,多做点体力活就是了,用个pop3协议或者模拟邮件登陆,得到邮件内容,用激活地址激活。有些网站使用的激活码是和用户信息相关的,这里就不具体讲,讲出来不好。和用户信息相关,那就有可能得到。比如,用密码的MD5作为激活码,那也不用登录邮箱,直接激活就行了。

三、突破验证码限制
一般来说,大一点的网站,验证码比较难破解,干扰之类的很验证,位置也可能变动。我以前写过一个怎么处理CSDN的验证码的文章,总体来说就是要对图片去除干扰色,把噪音降低到最小。然后,对字进行模式识别也好,进行矢量识别也罢,都需要大量的精力来处理。总地来说,一般的网站很容易就破解了,大多数网站那是太容易处理了,就是体力活。但是,一个网站一种特征,还是很难处理的,毕竟工作量太大。

四、 突破临时性IP限制
这种情况有,而且常见,比数据库记录IP的解决方案,这种方案更多一些。为什么?你不能把IP限制地死死地吧?要是一个IP只能投一票,那样的话,和他同IP的人(共享上网)不是不能投了?这种方案一般表现为单位时间T呢,只能投M票每个IP。这种方式要突破,可以让程序定时投票,而更加终极的解决方案就是IP欺骗。在下面详细讲讲。

五、突破永久性IP限制
这种限制常见于限制某些乱发贴人的限制。 上面讲到过,看到两个帖子讲这方面的,一般有下面四种方案:
1.修改HTTP头
修改HTTP就是让对方服务器认为你是代理服务器。 那为什么有的网站存在这种漏洞呢?这就要说说代理服务器。代理服务器分透明代理和匿名代理。匿名代理的话,请求头和你自身的请求头没差别。关键在于透明代理服务器,这种服务器会把你的真实IP转发出去。问题来了,有些网站为了更好地区别用户,获得用户所在地域,会去读这个转发来的IP,认为这个转发的IP才是真实的IP地址。这就存在了漏洞,攻击者可以通过伪造这个地址,服务器就会识别错误。具体方式见:
http://www.cnblogs.com/wangwei/archive/2009/09/19/1570242.html 

而对于一些网站做的限制,一般不会去读这个透明代理转发的头,因此这个方式在大多数情况下不适用。

2、重复拨号
可行性比较高,缺点是同一IP段的IP地址过少,而且需要占用一个带宽帐号,并且,可扩展性(汗,这个词汇都出来了)不强。 什么叫可扩展性,比如限制我要同时用5台机器操作,那就申请5个帐号,但是一般来说,这些帐号在一个地区,分别的IP会有重复,就是上面说的IP地址过少了。同时,这种方式请求速度也很慢。

3、代理服务器
 这个没啥好说的,如果代理服务器很多,还是有尝试的空间。

4、终极方案IP欺骗

要用IP欺骗,就要懂TCP/IP的原理。这个就不详细讲了,贫道对路由方面也不太了解。大家都知道,Socket2允许使用RawSocket,而RawSocket允许自定义IP头,而IP地址就包含在这个IP头中。就这样,可以伪造IP。

但是这种伪造的IP价值不大,最大的用处是被用来作DDOS攻击(汗一个)。这种简单地伪造IP,并不能建立三次握手。可以看贫道以前写的一篇文章http://www.cppblog.com/birdshover/archive/2008/11/10/66526.html(C++的代码,C#也可以实现的)。

这里可以看出,这种方式确实可以用的,但是要与其他的东西相配合。怎么配合呢?这里就要简单说下TCP协议。TCP协议的三次握手分别是:
Client(你的机器) ==== 请求(Syn) ====> Server(服务器)
 Server === 应答(Ack,Syn) ========> Client
 Client ==== 验证信息(ACK+1) =======> Server

 Client <====数据传递=====> Server

Syn是一个数字,是客户端随机生成的,服务器拿到这个数字同时对客户端应答,同时发送一个ACK的数字,ACK数字是服务器随机生成的。客户端拿到服务器端发回的Syn和Ack,首先检查Syn是不是自己发出去的,如果不是,数据包被丢弃。如果是的话,那就会把ACK发回去,服务器如果坚持这个ACK是自己发出去的,那么就认为和这个IP的连接是合法的了。

看看这个想到了什么?邪恶一点的想法,如果机器A与服务器在通信,而你的机器B拦截这个信息,同时把机器A弄死机,你就可以劫持这个会话。当然,这里面有很多其它需要处理的问题,主要是路由问题。

再邪恶一点的想法,直接伪造IP给服务器发送TCP连接请求。这里要注意,你的这个请求发过去,而服务器应答的时候,要保证其应答的IP没有被启用。比如,你用A的地址发了个请求给服务器,而服务器应答A,那样的话,A就会告诉服务器我没有发送过这个请求,那服务器就把连接关闭(关闭可能不恰当,说从TCP堆栈里删除了恰当一点)掉了。那假如A机器是关机状态呢?那服务器就会等待!这个就是DDOS攻击的原理,服务器在那里等,而TCP堆栈的大小是固定的,在服务器没反应过来之前,一直发连接,那么服务器就会TCP堆栈满了,这样就不会对其它的请求响应了,其它人的请求别拒绝了。

而伪造IP是和这个有关的,有两种方式伪造IP。一种是猜测Ack应答的数字,另外一个是欺骗它MAC地址。

猜测ACK应答数字,这个和TCP的实现原理有关,TCP启动的时候,是随机了一个数字没错,但是这个数字增长是有规律的。这里就不详述了,一般是先建立一个正确的连接,拿到这个数字,然后预测下一个数字,同时给服务器发送个请求,然后等服务器应答等待(相当于被DDOS)的时候,把这个预测的数字发过去。如果服务器验证成功这个数字,那么,就会建立连接。这个过程像是暴力破解,命中可能不是很高,在伪造IP投票系统中,效率不高。

第二种方式,对服务器进行MAC地址欺骗,就是把你的电脑的MAC地址与伪造的IP发过去,形成ARP欺骗。这样的话,它应答的数据包就不会被你的电脑抛弃,就可以用WinPcap在链路层取得这个数据包,进而得到Ack数字。也就是先用ARP欺骗一下,然后再伪造IP连接。在局域网中,实验是成功的,但是在广域网中,如何在路由上进行传递,贫道现在也没有经验。网上有种方案说是对路由器进行IP Table的欺骗,看得是云里来雾里去,仿佛贫道真的位列仙班了~~~。

基本上贫道见过的解决方案也就是这些了。另外对于注册用户那块,其实还是有其它一些思路,可以劫持到其它用户的会话的,就不详述了,等哪天再聊聊。最近找工作有点郁闷,就说到这里吧。

posted @ 2009-09-22 13:28 Birdshover 阅读(...) 评论(...) 编辑 收藏