可能有些人是第一次听到这个慢速攻击,这个是什么东西,会给我们的服务造成什么样的伤害。今天就跟大家分享一下,希望大家可以得到一些启发,加固好我们的系统服务。
慢速攻击是利用HTTP现有合法机制,在建立了与HTTP服务器的连接后,尽量长时间保持该连接,不释放,达到对HTTP服务器的攻击。
比如攻击者对任何一个开放了HTTP访问的服务器HTTP服务器,先建立了一个连接,指定一个比较大的content-length,然后以非常低的速度发表,比如1-10s发一个字节,然后维持住这个连接不断开。如果客户端持续建立这样的连接,那么服务器上可用的连接将一点一点被占满,从而导致拒绝服务。
1.Slow body:攻击者发送一个HTTP POST请求,该请求的Content-Length头部值很大,使得Web服务器或代理认为客户端要发送很大的数据。服务器会保持连接准备接收数据,但攻击客户端每次只发送很少量的数据,使该连接一直保持存活,消耗服务器的连接和内存资源。
2.Slow headers:Web应用在处理HTTP请求之前都要先接收完所有的http头部,因为HTTP头部中包含了一些Web应用可能用到的重要的信息。攻击者利用这点,发起一个HTTP请求,一直不停的发送HTTP头部,消耗服务器的连接和内存资源。
3.Slow read:客户端与服务器建立连接并发送了一个HTTP请求,客户端发送完整的请求给服务器端,然后一直保持这个连接,以很低的速度读取Response,比如很长一段时间客户端不读取任何数据,通过发送Zero Window到服务器,让服务器误以为客户端很忙,直到连接快超时前才读取一个字节,以消耗服务器的连接和内存资源。
这里我跟大家介绍一个工具slowhttptest,并说明怎么安装使用。
$ git clone https://github.com/shekyan/slowhttptest
这里安装到指定目录
/opt/testerzhang/mytool/safe,大家可自行安装指定的目录。
$ ./configure --prefix=/opt/testerzhang/mytool/safe
$ make
$ make install
$ cd /opt/testerzhang/mytool/safe
$ ./slowhttptest -h
可以看到有很多选项
-g 在测试完成后,以时间戳为名生成一个CVS和html文件的统计数据
-H SlowLoris模式
-B Slow POST模式
-R Range Header模式
-X Slow Read模式
-c number of connections 测试时建立的连接数
-d HTTP proxy host:port 为所有连接指定代理
-e HTTP proxy host:port 为探测连接指定代理
-i seconds 在slowrois和Slow POST模式中,指定发送数据间的间隔。
-l seconds 测试维持时间
-n seconds 在Slow Read模式下,指定每次操作的时间间隔。
-o file name 使用-g参数时,可以使用此参数指定输出文件名
-p seconds 指定等待时间来确认DoS攻击已经成功
-r connections per second 每秒连接个数
-s bytes 声明Content-Length header的值
-t HTTP verb 在请求时使用什么操作,默认GET
-u URL 指定目标url
-v level 日志等级(详细度)
-w bytes slow read模式中指定tcp窗口范围下限
-x bytes 在slowloris and Slow POST tests模式中,指定发送的最大数据长度
-y bytes slow read模式中指定tcp窗口范围上限
-z bytes 在每次的read()中,从buffer中读取数据量
这里我从官网下载了一个Tomcat服务,安装了一个JAVA工程,并启动了服务。
我们去访问
http://10.10.10.10:8100/test/loginDisplay这个登录页面,目前可以正常显示登录页面。
$ slowhttptest -c 1000 -B -g -o my_body_stats -i 110 -r 200 -s 8192 -t FAKEVERB -u http://10.10.10.10:8100/test/loginDisplay -x 10 -p 3
通过上面这个命令,我们再去访问
http://10.10.10.10:8100/test/loginDisplay这个登录页面,发现已经没有那么快响应了。
这样长时间下去,你的系统服务已经慢得不能对外提供服务,影响正常用户的体验。
这里列举两个常用的服务:
tomcat的connect保留的时间默认设置为20s,可以适当减少connect的时间,比如将connectTimeout修改为2秒。
1、通过调整$request_method,配置服务器接受http包的操作限制;
2、在保证业务不受影响的前提下,调整client_max_body_size, client_body_buffer_size, client_header_buffer_size,large_client_header_buffersclient_body_timeout, client_header_timeout的值,必要时可以适当的增加;
3、对于会话或者相同的ip地址,可以使用HttpLimitReqModule and HttpLimitZoneModule参数去限制请求量或者并发连接数;
4、根据CPU和负载的大小,来配置worker_processes 和 worker_connections的值,公式是:max_clients = worker_processes * worker_connections。
由于本人非从事安全领域,以上的处理方式仅仅提供参考。
安全无小事,我们身处互联网下,保护好自己的系统服务,才是王道。