漏洞描述:
Slow HTTP Denial of Service Attack 中文叫作缓慢的HTTP攻击漏洞,服务器在接收到请求时,彻底接收之后才会处理请求,若是攻击者发送的比较缓慢或者发送的不完整,服务器会保留其链接,占用资源池,若是请求数量较多,就会造成 DOS 攻击。
利用的HTTP POST的时候,指定一个非常大的content-length,然后以很低的速度发包,比如10-100s发一个字节,hold住这个连接不断开。这样当客户端连接多了后,占用住了webserver的所有可用连接,从而导致DOS。
slowhttptest安装:
kali直接安装 apt-get install slowhttptest
实例:
slowloris模式:
slowhttptest -c 1000 -H -g -o my_header_stats -i 10 -r 200 -t GET -u "url" -x 24 -p 3
slow post模式:
slowhttptest -c 3000 -B -g -o my_body_stats -i 110 -r 200 -s 8192 -t FAKEVERB -u "url" -x 10 -p 3
slow read模式:
slowhttptest -c 65539 -X -r 200 -w 512 -y 1024 -n 5 -z 32 -k 3 -u "url" -p 3
Range Header test:在http请求的RANGE HEADER中包含大量字段,使得服务器在服务端将一个很小的文件分割成大量的更小的片段再压缩。分段压缩过程消耗大量的服务器资源,导致DOS。
slowhttptest -R -u "url" -t HEAD -c 1000 -a 10 -b 3000 -r 500
测试的时候,添加代理:
slowhttptest -c 1000 -X -r 1000 -w 10 -y 20 -n 5 -z 32 -u url -p 5 -l 350 -e lhost:lport
然后查看浏览器网络连接时间对比:
明显连接超时,异常访问时间。
修复方法:
对web服务器的http头部传输的最大许可时间进行限制,修改成最大许可时间为8秒。
具体方法如下:
Windows系统:
可通过安装服务器安全狗(http://free.safedog.cn/)开启DDoS防火墙防护,攻击IP将被冻结禁止访问。
Tomcat:
tomcat配置文件conf/server.xml中,
<Connector port="80" protocol="HTTP/1.1"
connectionTimeout="2000"
maxThreads="100"
minSpareThreads="50"
maxSpareThreads="100"
minProcessors="50"
maxProcessors="100"
enableLookups="false"
acceptCount="100"
redirectPort="8443" URIEncoding="UTF-8"/>
修复的效果立竿见影,攻击对服务器基本没影响了。
Apache:
httpd.conf下启用mod_reqtimeout模块
去掉LoadModule reqtimeout_module modules/mod_reqtimeout.so前面的#号
增加以下配置:
<IfModule reqtimeout_module>
RequestReadTimeout header=5-40,MinRate=500 body=20,MinRate=500
IfModule>
重启apache,工具扫描确认漏洞是否修改完成。
也能够安装两个新的模块 mod_qos
和 mod_security
<IfModule mod_qos.c>
# handle connections from up to 100000 different IPs
QS_ClientEntries 100000
# allow only 50 connections per IP
QS_SrvMaxConnPerIP 50
# limit maximum number of active TCP connections limited to 256
MaxClients 256
# disables keep-alive when 180 (70%) TCP connections are occupied
QS_SrvMaxConnClose 180
# minimum request/response speed (deny slow clients blocking the server, keeping connections open without requesting anything
QS_SrvMinDataRate 150 1200
IfModule>
方法2:设置每一个 IP 只能创建20个链接
iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 20 -j REJECT --reject-with tcp-reset
查看创建的链接数
netstat -ant | grep $ip:80 | grep EST | wc -l
设置完iptables
后,当即生效,可是使用工具进行攻击的时候,仍是会提示攻击成功,由于攻击者本身只能与服务器创建20个链接,超过20个链接后,会提示服务不可用。
服务器创建的链接数:
IIS:
1.设定请求筛选属性: 用来限制HTTP请求的URL及query string长度。
取消勾选 [允许未列出的谓词]
最大URL长度: 2048
最大查询字符串: 1024
2.设定标头:
在标头中设定 [Content-type] : 100
3.设定connectionTimeout, headerWaitTimeout, and minBytesPerSecond等属性來降低攻击所带来的影响。
<configuration>
<system.applicationHost>
<webLimits connectionTimeout="00:00:30"
headerWaitTimeout="00:00:30"
minBytesPerSecond="250"
/>
system.applicationHost>
configuration>
4.设定完成后,请执行IIS Reset 让设定生效。
Nginx:
关闭慢速连接:可以关闭正在写入数据的连接,这可能意味着尝试尽可能保持连接打开(从而降低服务器接受新连接的能力)。Slowloris是这种类型的攻击的一个例子。
client_body_timeout:(http://nginx.org/en/docs/http/ngx_http_core_module.html#client_body_timeout)指令控制NGINX在客户机体写入之间等待的时间。
client_header_timeout:(http://nginx.org/en/docs/http/ngx_http_core_module.html#client_header_timeout) 指令控制NGINX在写入客户机标题之间等待的时间。这两个指令的默认值是60秒。
本示例将NGINX配置为在来自客户端的写入或头文件之间等待不超过5秒钟:
server {
client_body_timeout 5s;
client_header_timeout 5s;
limit_conn perserver 300;#限制当前站点最大并发数
limit_conn perip 25;#限制单个IP访问最大并发数
limit_rate 512k;#限制每个请求的流量上限(单位:KB)
# ...
}