科普HTTP Slow Attack 和 Apache DOS 漏洞的修复
导读
HTTP 的 Slow Attack 有着悠久历史的 HTTP DOS 攻击方式,最早大约追溯到 5 年前,按理说早该修复了,但是 Apache 的默认配置中仍然没有添加相关配置,或者他们认为这是 feture 不是 bug,所以至今默认安装的 Apache 中还存在着 Slow Attack 的威胁。
1、Slow Attack 大致可分为以下几种:
Slow Header (slowloris):每个 HTTP 请求都是以空行结尾,即以两个 (\r\n)结 尾 。 若将空行去掉 ,即以 一个 (\r\n) 结尾,则服务器会一直等待直到超时。在等待过程中占用线程(连接数),服务器线程数量达到极限,则无法处理新的合法的 HTTP请求,达到DOS目的。
Slow Read:向 Web 服务器发送正常合法的 read 请求,请求一个很大的文件,并将 TCP 滑动窗口 size 设置很小如 1 或 2,服务器就会以非常缓慢的速度发送文件,文件将长期滞留在服务器内存中,消耗资源,造成DOS。
Slow Post:攻击者向服务器发送 POST 请求,告诉服务器它将要 POST 的数据为 n,服务器将分配长度为 n 的空间来等待接收数据。当 n 足够大, POST 的请求足够多的时候,这种攻击会占用服务器的大量内存,从而降低服务器性能,甚至导致瘫痪。
以及多年前的 Apache Range Attack(现已修复):在 HTTP 请求的 RANGE HEADER 中包含大量字段,使得服务器在服务端将一个很小的文件分割成大量的更小的片段再压缩。分段压缩过程消耗大量的服务器资源,导致 DOS。
2、漏洞证明:
测试环境
Debian7 x86_64 & Apache 2.2.22
Debian8 x86_64 & Apache 2.4.10
配置和测试工具
(1) 在 Debian 中通过 apt 安装默认的 Apache
apt-get -y install apache2
(2) 在默认的 DocumentRoot 目录里面放一个测试文件,serverlist.txt
(3) 更换监听端口为 8889(程序 GG 们是不是有似曾相识的感觉)
(4) 用 slowhttptest 工具对 debian7 测试上面四种攻击方法,工具 wiki
结果如下:
slow header
slowhttptest -c 65500 -H -i 10 -r 200 -s 8192 -t SLOWHEADER -u http://debian7:8889
给 Apache 发送的请求如下(Header 少了一个换行,表示 Header 一直没发完):
Apache 中充斥着这样的连接,导致 DOS
slow read
slowhttptest -c 65500 -X -r 1000 -w 10 -y 20 -t SLOWREAD -n 5 -z 32 -u http://debian7:8889
给 Apache 发送的是合法的请求(但是窗口很小)
最终导致占满了连接,依然 DOS
slow post
slowhttptest -c 65500 -B -i 10 -r 200 -s 8192 -t SLOWBODY -u http://debian7:8889
给 Apache 发送的请求如下(以很慢的速度来发送 message body)
同样也导致 DOS
Apache Range Attack
已失效的攻击方法,可以看一下它给 Apache 发送的请求是什么样的
slowhttptest -c 65000 -R -u http://debian7:8889 -t HEAD -a 5 -b 300000 -r 500
要求服务器将文件分成很多很多的小段,用来消耗服务器资源,理论上 CPU 和 Memory 会增加
3、漏洞修复方法
(1) 根据作者的文章:[How to Protect Against Slow HTTP Attacks]
对于 Apache 可以做以下优化:
设置合适的 timeout 时间(Apache 已默认启用了 reqtimeout 模块),规定了 Header 发送的时间以及频率和 Body 发送的时间以及频率
增大 MaxClients(MaxRequestWorkers):增加最大的连接数。根据官方文档,两个参数是一回事,版本不同,
MaxRequestWorkers was called MaxClients before version 2.3.13. The old name is still supported.
默认安装的 Apache 存在 Slow Attack 的威胁,原因就是虽然设置的 timeoute,但是最大连接数不够,如果攻击的请求频率足够大,仍然会占满 Apache 的所有连接
(2) 根据这篇文章:[How To Mitigate Slow HTTP DoS Attacks in Apache HTTP Server]
可以使用 Apache 的模块来缓解 Http Slow Attack
mod_reqtimeout:默认已启用。设置 header 和 body 的发送时间及频率
<IfModule reqtimeout_module>RequestReadTimeout header=20-40,minrate=500RequestReadTimeout body=10,minrate=500</IfModule>
mod_qos:开源模块,需额外安装。可设置多个参数来控制客户端的连接,如最大 IP 数、每个 IP 最大连接数等
<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>mod_security:开源模块,需额外安装。性能较好,可以为 Web 应用提供一个外部安全层来检测和抵御攻击
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'"
根据上面的配置, mod_security 记录每个 IP 让 Apache 返回 408(request timeout) 的次数,当一分钟内超过 5 次时,那个 IP 的请求会在 5 分钟内全部被丢弃。 当然也可以根据实际情况配置其他的安全策略。
(3) serverlist 使用场景下最简单的修复方法
刚刚的使用场景仅仅是从 Apache 获取 serverlist,每个 IP 只需要一个短链接就可以满足需求,所以直接在 iptables 中限制每个 IP 的连接数可以解决以上绝大部分问题,除非攻击者拥有众多肉鸡,否则单 IP 的攻击将失去效果。
iptables -A INPUT -p tcp --syn --dport 8889 -m connlimit --connlimit-above 20 -j REJECT --reject-with tcp-reset
用 iptables 设置了每个 IP 的最大连接数后,测试结果显示 Attacker 只能建立 20 个连接,所有攻击方法失效。
后记
默认安装的 Apache 还是比较坑的,一不小心就被 DDOS 了,大家在安装部署服务的时候还是要根据实际情况谨慎配置服务。
关于 Slow Attack 对其他 Web 服务器的影响,可以参见作者的文章:Testing Web Servers for Slow HTTP Attacks
科普HTTP Slow Attack 和 Apache DOS 漏洞的修复的更多相关文章
- 【漏洞学习】slowHTTPtest 慢速 DOS 攻击方法 修复方案
日期:2018-05-28 21:41:59 更新:2019-07-05 23:15:21 作者:Bay0net 介绍:学习一下 slowHTTPtest 的攻击及防御. 0x01. 安装 下载链接 ...
- [ 高危 ] hash碰撞DOS漏洞
这是一个很神奇的漏洞 hotel.meituan.com订单页面,POST提交的是一串json数据.当把这串数据换成json碰撞数据 后,服务器原本 100毫秒可以响应的数据包,变成需要30秒才能响应 ...
- 重现apache commons fileupload DOS漏洞
这个漏洞是2014年2月4日被发现的, 因为该组件试用范围非常广, 所以该漏洞的影响也非常巨大.通过特制的包含畸形header的http请求,可以导致使用该组件的应用程序进入无限循环从而耗尽CPU等资 ...
- PHP DOS漏洞的新利用:CVE-2015-4024 Reviewed
1. 背景介绍 今天我们想从2015.04.03的一个PHP远程dos漏洞(CVE-2015-4024)说起.技术细节见如下链接,https://bugs.php.net/bug.php?id ...
- 记录php漏洞--宇宙最强语言 PHP 爆出 DoS 漏洞,可以直接灌满 CPU
站长之家(Chinaz.com)5月20日消息 近日,PHP被爆出存在远程DOS漏洞,若黑客利用该漏洞构造PoC发起连接,容易导致目标主机CPU被迅速消耗.此漏洞涉及众多PHP版本,因而影响范围极大 ...
- PHP多个版本爆出远程DOS漏洞
近日,php多个版本爆出远程DoS漏洞(官方编号69364),利用该漏洞构造poc发起链接,很容易导致目标主机cpu的100%占用率,绿盟科技威胁响应中心随即启动应急机制, 启动应急响应工作,总结PH ...
- 利用最新Apache解析漏洞(CVE-2017-15715)绕过上传黑名单
转载自:https://www.leavesongs.com/PENETRATION/apache-cve-2017-15715-vulnerability.html 目标环境: 比如,目标存在一个上 ...
- HTTP Slow Attack测试工具SlowHTTPTest
HTTP Slow Attack测试工具SlowHTTPTest Slow Attack是HTTP常见的一种拒绝服务攻击方式.它通过消耗服务器的系统资源和连接数,导致Web服务器无法正常工作.常见 ...
- [转帖]预警 | Linux 爆“SACK Panic”远程DoS漏洞,大量主机受影响
预警 | Linux 爆“SACK Panic”远程DoS漏洞,大量主机受影响 https://cloud.tencent.com/developer/article/1447879 所有的 版本 ...
随机推荐
- javascript文本格式化之HTML标签(转载)
文本格式化标签: 标签 描述 <b> 定义粗体文本. <big> 定义大号字. <em> 定义着重文字. <i> 定义斜体字. <small> ...
- C++泛型和算法
看书的速度终于慢了下来,倒不是难于理解,而是需要理解的东西有点多. 先吐槽下C++Primer这本书,不少地方都是用抽象的语言进行介绍! 拜托,你这是介绍,不是总结! 像容器适配器那里: “本质上,适 ...
- 第三百零九节,Django框架,models.py模块,数据库操作——F和Q()运算符:|或者、&并且——queryset对象序列化
第三百零九节,Django框架,models.py模块,数据库操作——F()和Q()运算符:|或者.&并且 F()可以将数据库里的数字类型的数据,转换为可以数字类型 首先要导入 from dj ...
- bootstrap -- css -- 按钮
本文中提到的按钮样式,适用于:<a>, <button>, 或 <input> 元素上 但最好在 <button> 元素上使用按钮 class,避免跨浏 ...
- Android camera 竖直拍照 获取竖直方向照片
竖直拍照 if (Integer.parseInt(Build.VERSION.SDK) >= 8) { camera.setDisplayOrientation(90); } else ...
- 网站性能测试PV到TPS的转换以及TPS的波动和淘宝性能测试要点
<淘宝性能测试白皮书V0.3> 性能测试的难点不在于测,在于测出的数据和实际的对照关系,以及测试出来的数据对性能的评估(到底是好,还是不好). 淘宝性能测试白皮书,解决了我的4个问题:1. ...
- Http Digest认证协议
转自:http://blog.csdn.net/htjoy1202/article/details/7067287 其认证的基本框架为挑战认证的结构,如下图所示: 1.客户端希望取到服务器上的某个资源 ...
- mysql数据库不能远程访问的问题
1.先暂停防火墙,检查是不是防火墙的问题. 2. 如若不是防火墙的问题,则可能是用户权限的问题. 这里创建一个用户来用于远程连接:首先登陆你的mysql数据库 命令: mysql -uroot -p ...
- C# 基础小知识之yield 关键字
对于yield关键字我们首先看一下msdn的解释: 如果你在语句中使用 yield 关键字,则意味着它在其中出现的方法.运算符或 get 访问器是迭代器. 通过使用 yield 定义迭代器,可在实现自 ...
- shell中判断一个变量是否为0或者为某个具体的值
需求说明: 在实际写脚本的过程中,需要判断某个变量的值是否为某个数字, 比如,判断某个进程的数量是否为0用来确定进程是否存在,这样的情况. 简单来说,算术比较. 测试过程: 通过以下的脚本来判断mys ...