慢速攻击了解的人比较少,是CC攻击的一个变种,可以使用很少的资源发起攻击。
慢速攻击的原理
慢速攻击的基本原理如下:对任何一个开放了HTTP访问的HTTP服务器,先建立了一个连接,指定一个比较大的content-length,然后以非常低的速度发包,比如1-10s发一个字节,然后维持住这个连接不断开。如果客户端持续建立这样的连接,那么服务器上可用的连接将一点一点被占满,从而导致拒绝服务。
与可能需要一个僵尸网络才能发起的分布式攻击相反,发起低速缓慢攻击不需要很多资源,使用一台计算机就可以成功发起。用于发动低速缓慢攻击的最受欢迎的工具是 Slowloris 、 R.U.D.Y.和Slowhttptest。
慢速攻击的分类
- Slow headers
Web应用在处理HTTP请求之前都要先接收完所有的HTTP头部,因为HTTP头部中包含了一些Web应用可能用到的重要的信息。攻击者利用这点,发起一个HTTP请求,一直不停的发送HTTP头部,消耗服务器的连接和内存资源。
- Slow body
攻击者利用HTTP POST请求进行一种攻击,该请求的Content-Length头部值被设置为一个非常大的值,从而让Web服务器或代理误认为客户端即将发送大量的数据。服务器因此会保持连接以准备接收数据,然而攻击者每次只发送极少量的数据,导致连接始终保持活动状态,不断消耗服务器的连接和内存资源。
- Slow read
客户端与服务器建立连接并发送了一个HTTP请求,客户端发送完整的请求给服务器端,然后一直保持这个连接,以很低的速度读取Response,比如很长一段时间客户端不读取任何数据,通过发送Zero Window到服务器,让服务器误以为客户端很忙,直到连接快超时前才读取一个字节,以消耗服务器的连接和内存资源。
哪些服务器容易被慢速攻击?
慢速攻击利用thread-based架构的服务器特性进行攻击。这种服务器为每个新连接打开一个线程,并等待接收完整的HTTP头部才释放连接。虽然服务器设置了一个超时时间(默认为300秒)来等待不完整的连接,但一旦接收到客户端发送的数据,超时时间会被重置。攻击者利用这一特性可以轻易地保持连接,只需在超时前发送一个字符即可延长超时时间。攻击者只需少量资源即可打开多个连接,占用服务器大量资源。
经验证,Apache、httpd采用thread-based架构,很容易遭受慢速攻击。而另外一种event-based架构的服务器,比如nginx和lighttpd则不容易遭受慢速攻击。
如何防护慢速攻击?
Apache服务器现在使用较多的有三种简单防护方式:
- mod_reqtimeout
Apache2.2.15后,该模块已经被默认包含,用户可配置从一个客户端接收HTTP头部和HTTP body的超时时间和最小速率。如果一个客户端不能在配置时间内发送完头部或body数据,服务器会返回一个408REQUEST TIME OUT错误。
- mod_qos
Apache的一个服务质量控制模块,用户可配置各种不同粒度的HTTP请求阈值;
- mod_security
一个开源的WAF模块,有专门针对慢速攻击防护的规则,配置如下:
SecRule RESPONSE_STATUS “@streq 408” “phase:5,t:none,nolog,pass, setvar:ip.slow_dos_counter=+1, expirevar:ip.slow_dos_counter=60, id:’1234123456′”
SecRule IP:SLOW_DOS_COUNTER “@gt 5” “phase:1,t:none,log,drop,msg:’Client Connection Dropped due to high number of slow DoS alerts’, id:’1234123457′”
针对CC攻击,传统的流量清洗设备主要通过设定阈值来进行防护。当某个客户在一定周期内的请求访问量超过阈值时,清洗设备会采取返回验证码或JS代码的方式进行防护。这种防护方式基于攻击者使用的DDoS工具通常不会解析服务端返回数据,也不会解析JS代码等。因此,当清洗设备截获到HTTP请求时,返回一段特殊的JavaScript代码。正常用户的浏览器可以处理并正常跳转,不受影响,而攻击程序则会攻击到无效的位置。
而对于慢速攻击来说,通过返回验证码或者JS代码的方式依然能达到部分效果。但是根据慢速攻击的特征,可以辅助以下几种防护方式:
1、周期内统计报文数量。针对一个TCP连接,HTTP请求的报文中,报文过多或者报文过少都是有问题的,如果一个周期内报文数量非常少,那么它就可能是慢速攻击;如果一个周期内报文数量非常多,那么它就可能是一个CC攻击。
2、限制HTTP请求头的最大许可时间。请求超过最大许可时间,如果数据还没有传输完成,那么它就有可能是一个慢速攻击。