Chinaunix首页 | 论坛 | 博客
  • 博客访问: 852855
  • 博文数量: 275
  • 博客积分: 3904
  • 博客等级: 中校
  • 技术积分: 4605
  • 用 户 组: 普通用户
  • 注册时间: 2012-04-17 21:10
文章分类

全部博文(275)

文章存档

2014年(9)

2013年(124)

2012年(142)

分类: 系统运维

2012-09-19 14:39:33

很多朋友都知道木桶理论,一桶水的最大容量不是由它最高的地方决定的,而是由它最低的地方决定,也是一样,服 务器的安全性也是由它最脆弱的地方决定的,最脆弱的地方有多危险就有多危险。DDOS也是一样,只要你的服务器存在一个很耗资源的地方,限制又不 够,就马上成为别人DDOS的对象.比如 SYN-FLOOD,它就是利用服务器的半连接状态比完全连接状态更耗资源,而SYN发动方只需要不停的发包,根本不需要多少资源。



  一个好的DDOS攻击必须是通过自己极少资源的消耗带来对方较大的资源消耗,否则比如ICMP-FLOOD和UDP-FLOOD都必须和别人一样大的 带宽,对方服务器消耗多少资源自己也得赔上多少资源,效率极其低下,又很容易被人发现,现在基本没有什么人用了。



  攻击原理



  CC主要是用来攻击页面的.大家都有这样的经历,就是在访问论坛时,如果这个论坛比较大,访问的人比较多,打开页面的速度会比较慢,对不?!一 般来 说,访问的人越多,论坛的页面越多,数据库就越大,被访问的频率也越高,占用的系统资源也就相当可观,现在知道为什么很多空间服务商都说大家不要上传论 坛,聊天室等东西了吧。



  一个静态页面不需要服务器多少资源,甚至可以说直接从内存中读出来发给你就可以了,但是论坛就不一样了,我看一个帖子,系统需要到数据库中判断 我是否 有读读帖子的权限,如果有,就读出帖子里面的内容,显示出来——这里至少访问了2次数据库,如果数据库的体积有200MB大小,系统很可能就要在这 200MB大小的数据空间搜索一遍,这需要多少的CPU资源和时间?如果我是查找一个关键字,那么时间更加可观,因为前面的搜索可以限定在一个很小的范围 内,比如用户权限只查用户表,帖子内容只查帖子表,而且查到就可以马上停止查询,而搜索肯定会对所有的数据进行一次判断,消耗的时间是相当的大。



  CC就是充分利用了这个特点,模拟多个用户(多少线程就是多少用户)不停的进行访问(访问那些需要大量数据操作,就是需要大量CPU时间的页 面)。很 多朋友问到,为什么要使用代理呢?因为代理可以有效地隐藏自己的身份,也可以绕开所有的防火墙,因为基本上所有的防火墙都会检测并发的 TCP/IP连接数目,超过一定数目一定频率就会被认为是Connection-Flood。



  使用代理攻击还能很好的保持连接,我们这里发送了数据,代理帮我们转发给对方服务器,我们就可以马上断开,代理还会继续保持着和对方连接(我知道的记 录是有人利用2000个代理产生了35万并发连接)。



  可能很多朋友还不能很好的理解,我来描述一下吧.我们假设服务器A对Search.asp的处理时间需要0.01S(多线程只是时间分割,对结 论没有 影响),也就是说他一秒可以保证100个用户的Search请求,服务器允许的最大连接时间为60s,那么我们使用CC模拟120个用户并发连接,那么经 过1分钟,服务器的被请求了7200次,处理了6000次,于是剩下了1200个并发连接没有被处理.有的朋友会说:丢连接!丢连接!问题是服务器是按先 来后到的顺序丢的,这1200个是在最后10秒的时候发起的,想丢?!还早,经过计算,服务器满负开始丢连接的时候,应该是有7200个并发连接存在队 列,然后服务器开始120个/秒的丢连接,我们发动的连接也是120个/秒,服务器永远有处理不完的连接,服务器的CPU 100%并长时间保持,然后丢连接的60秒服务器也判断处理不过来了,新的连接也处理不了,这样服务器达到了超级繁忙状态。



  蝴蝶:我们假设服务器处理Search只用了0.01S,也就是10毫秒(这个速度你可以去各个有开放时间显示的论坛看看),我们使用的线程也 只有 120,很多服务器的丢连接时间远比60S长,我们的使用线程远比120多,可以想象可怕了吧,而且客户机只要发送了断开,连接的保持是代理做的,而且当 服务器收到SQL请求,肯定会进入队列,不论连接是否已经断开,而且服务器是并发的,不是顺序执行,这样使得更多的请求进入内存请求,对服务器负担更大。



  当然,CC也可以利用这里方法对FTP进行攻击,也可以实现TCP-FLOOD,这些都是经过测试有效的。



  防范方法



  说了攻击原理,大家肯定会问,那么怎么防御?使用硬件防火墙我不知道如何防范,除非你完全屏蔽页面访问,我的方法是通过页面的编写实现防御。



  1. 使用Cookie认证.这时候朋友说CC里面也允许Cookie,但是这里的Cookie是所有连接都使用的,所以启用IP+Cookie认证就可以了。



 


 2. 利用Session.这个判断比Cookie更加方便,不光可以IP认证,还可以防刷新模式,在页面里判断刷新,是刷新就不让它访问,没有刷新符号给它刷 新符号.给些示范代码吧,Session:



  程序代码:



  〈%



  if session(“refresh”)〈〉 1 then



  Session(“refresh”)=session(“refresh”)+1



  Response.redirect “index.asp”



  End if



  %〉



  这样用户第一次访问会使得Refresh=1,第二次访问,正常,第三次,不让他访问了,认为是刷新,可以加上一个时间参数,让多少时间允许访问,这 样就限制了耗时间的页面的访问,对正常客户几乎没有什么影响。



  3. 通过代理发送的HTTP_X_FORWARDED_FOR变量来判断使用代理攻击机器的真实IP,这招完全可以找到发动攻击的人,当然,不是所有的代理服 务器都发送,但是有很多代理都发送这个参数.详细代码:



  程序代码:



  〈%



  Dim fsoObject



  Dim tsObject



  dim file



  if Request.ServerVariables("HTTP_X_FORWARDED_FOR")="" then



  response.write "无代理访问"



  response.end



  end if



  Set fsoObject = Server.CreateObject("Scripting.FileSystemObject")



  file = server.mappath("CCLog.txt")



  if not fsoObject.fileexists(file) then



  fsoObject.createtextfile file,true,false



  end if



  set tsObject = fsoObject.OpenTextFile(file,8)



  tsObject.Writeline Request.ServerVariables("HTTP_X_FORWARDED_FOR")



  &"["&Request.ServerVariables("REMOTE_ADDR")&"]"&now()



  Set fsoObject = Nothing



  Set tsObject = Nothing



  response.write "有代理访问"



  %〉



  这样会生成CCLog.txt,它的记录格式是:真实IP [代理的IP] 时间,看看哪个真实IP出现的次数多,就知道是谁在攻击了.将这个代码做成Conn.asp文件,替代那些连接数据库的文件,这样所有的数据库请求就连接 到这个文件上,然后马上就能发现攻击的人。



  4. 还有一个方法就是把需要对数据查询的语句做在Redirect后面,让对方必须先访问一个判断页面,然后Redirect过去。



  5. 在存在多站的服务器上,严格限制每一个站允许的IP连接数和CPU使用时间,这是一个很有效的方法。



  CC的防御要从代码做起,其实一个好的页面代码都应该注意这些东西,还有SQL注入,不光是一个入侵工具,更是一个DDOS缺口,大家都应该在 代码中 注意.举个例子吧,某服务器,开动了5000线的CC攻击,没有一点反应,因为它所有的访问数据库请求都必须一个随机参数在Session里面,全是静态 页面,没有效果.突然发现它有一个请求会和外面的服务器联系获得,需要较长的时间,而且没有什么认证,开800线攻击,服务器马上满负荷了。



  代码层的防御需要从点点滴滴做起,一个脚本代码的错误,可能带来的是整个站的影响,甚至是整个服务器的影响,慎之!


++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


CC攻击分析与新思路



现在最热门的就是CC攻击了,CC巧妙利用大量的代理,拖跨动态网站.防护难度之大,有目共睹.


现在的抗CC技术基本上就是过滤关键字,还有程序自身的防刷新技术.


分别简单分析一下,这两种技术,最后提出一个新的防护思路,一起分析:


过滤关键字,的确有一定的防护效果,可以有效保护动态网站服务器,对于小型CC攻击或加上服务器强大的处理能力,还是能挺的过去.此方法有以下缺 点,一是 互联网上的服务器复杂,有很多代理软件,每个代理软件都有自己的关键字,如果每个都过滤对速度影响之大,当然抓包分析,可以看出三次握手后,如果有关键字 的话前几个包就包括你需要的关键字,这是优化处理,效果有限.二是有不少代理软件根本没有任何指示是代理的关键字,所以这部分代理就不能防范了,代理找的 越多,几率越大.所以面对强大的CC攻击时,用户反应效果不好.如果有心人专找这种代理的话,是很可怕的事,也不能通过IP找到攻击着.


防刷新技术,有两种.一种是在地层,另一种是动态脚本中加入.这两种技术也都有局限性,地层防刷新,可以通过限制每秒或几秒通过SYN数,也可能对 每个请 求(URL)每秒不能通过多少个,进行限制的办法.这种方法也有一定的效果,但是很容易误报,用户不小多点了几个窗口就不能访问了.最后就是脚本中加入 了,防刷新的功能,也是有一定的效果,可能也存在前边的问题.另外是攻击包已经到了服务器了,这时为每个代理只少查询了一次数据库了,如果代量多的话,一 样也能拖跨服务器.


通过分析可知,每个方法都有一定的效果,可又都不是完美的解决CC的方案,其实并不是没有办法的,我们仔细想想可知,CC攻击有如下特点:


(1)攻击着为了攻击动态网站,都是用了专用的CC攻击工具,此工具必须能比较快的建立三次握手,并且能快速的断开.


(2)必须借助大量第三方的代理服务器.



我们首先分析代理服务器,代理服务器既然是第三方的,不是CC攻击者的,所以呢代理服务器的行为是固定的,就是CC攻击着不能改变其功能,只能被动 使用. 通过代理服务器的原理可知,他就是把用户发来的请求进行解析,转发出去,等待服务器返回数据做个备份,下次再有请求时,直接返数据.就是只有转发,缓存网 页的做用,没有对脚本执行分析的作用(这点很重点).


再次分析攻击软件的特点,攻击软件只是与代理建立三次握手,发出个GET请求就断开了,省下的就又代理完成,为什么这么做请看CC攻击作者说明.本身对脚 本也没有执行分析的作用(这点很重要).


我们反过来看看,我们正常的访问,访问动态网站都是用IE等有分析执行功能的浏览器(这点很重要).


好,我们知道这些特点,下边就是怎么利用这个特点进行防护.


当我们的防火墙与代理完成三次握手后,代理会向服务器发出GET请求,这时我们的防火墙截获此包,然后替服务器对代理服务器进行应答,这个应答是一 个转向 脚本,告诉代理服务器你访问网站在别一个地方,同时这个应答包中包括代理服务器真实的请求+上防火墙加密的动态数据(防止被解密),等待这个代理再次发出 我们要求的这个转向请求,如果验证加密的数据是对的,就发个服务器,完成实际的请求(这地方有个seq包同步问题,很好解决).刚才发到的包是攻击软件发 出的,他就不会就浏览器一样,正确解释执行这个加密脚本.大体思想就是这样的.



好处,一是不依靠有限的关键字,漏掉部分代理.二是并不武断拒绝一切代理,只要不是攻击,正常的用户是可以用代理访问的.

阅读(1000) | 评论(0) | 转发(0) |
0

上一篇:理解 rip计时器

下一篇:Cisco 防火墙FO实验

给主人留下些什么吧!~~