结合DoS压力测试工具slowhttptest来学习利用方式,slowhttptest包括三种攻击模式Slowloris, Slow HTTP POST, Slow Read attack。
slowhttptest介绍:https://www.cnblogs.com/shenlinken/p/7400336.html
1. Slowloris
1.1 原理
抓一个正常的http请求包,可以看到http header的结尾是"0d0a0d0a",如下图:
HTTP协议默认在接收到全部信息之后才会开始处理,Slowloris发送的http deader结尾为"0d0a",此时服务器会因为没有接受到完整信息而保留连接池一直等待直到超时,当建立的连接占满连接池之后,DoS攻击达到目的。
1.2 利用方式
先访问一下靶机,此时可以访问成功
开启slowhttptest执行以下命令:
slowhttptest -c 1000 -H -i 10 -r 200 -s 8192 -t SLOWHEADER -u URL
执行命令之后,当连接数达到265时,靶机服务不可用:
2.Slow HTTP POST
2.1 原理
http deader完整发送,但设置超大的content-length值,但每次只发送很小的一个包,此时服务器会开启连接池一直等待后续数据直到超时,当建立的连接占满连接池之后,DoS攻击达到目的。
2.2 利用方式
开启slowhttptest执行以下命令(设置content-length值为81920):
slowhttptest -c 1000 -B -i 10 -r 200 -s 81920 -t SLOWBODY -u URL
3.Slow Read attack
3.1 原理
设置传输速率为一个特别小的值,同时请求一个特别大的资源,服务器就会保持连接进行长时间通信直到连接池被占满。
3.2 利用方式
开启slowhttptest执行以下命令(设置content-length值为81920):
slowhttptest -c 1000 -X -r 1000 -w 10 -y 20 -t SLOWREAD -n 5 -z 32 -u URL
4. 防御实验
用网上建议的方法设置apache如下:
httpd.conf增加配置:
<IfModule reqtimeout_module> RequestReadTimeout header=5,MinRate=500 body=10,MinRate=500 </IfModule>
同时配置mpm_winnt模块的参数如下
<IfModule mpm_winnt_module> ThreadsPerChild 450 MaxConnectionsPerChild 45000 </IfModule>
对应的配置参数作用如下:
ThreadsPerChild
每个子进程的最大并发线程数。
- MaxRequestsPerChild
- 每个子进程允许处理的请求总数。如果累计处理的请求数超过该值,该子进程将会结束(然后根据需要确定是否创建新的子进程),该值设为0表示不限制请求总数(子进程永不结束)。该参数建议设为非零的值,可以带来以下两个好处:
- 可以防止程序中可能存在的内存泄漏无限进行下去,从而耗尽内存。
- 给进程一个有限寿命,从而有助于当服务器负载减轻的时候减少活动进程的数量。
设置完成后,再次用slowhttptest发请求:
Slowloris模式下,靶机没有挂掉:
另外两种模式下,靶机会挂掉但会再次恢复,服务没有完全挂掉,起到了很好的缓解作用:
个人理解Slowloris模式下靶机没有挂掉,是RequestReadTimeout设置的header等待时间起了作用,header不会一直等待所以攻击失败。
另外两种模式下靶机没有挂掉,是mpm_winnt的设置起的作用,当请求超过最大值时,子进程自动结束(靶机出现中断),然后子进程自己恢复(靶机又能访问),从而很好的缓解了DoS攻击。
如需转载,请注明出处,这是对他人劳动成果的尊重~