慢速 HTTP 拒绝服务: 分析利用和缓解

https://www.518cn.com   发布时间:2025-03-18 18:52   作者:网络
摘要:慢速 HTTP 拒绝服务: 分析、利用和缓解 慢速 HTTP 攻击Slow HTTP DoS Attack基于这样一个事实,即 HTTP 协议在设计上要求服务器在处理请求之前完全接收请求。如果 HTTP 请求未完成,或者传输

慢速 HTTP 拒绝服务: 分析、利用和缓解

    慢速 HTTP 攻击Slow HTTP DoS Attack基于这样一个事实,即 HTTP 协议在设计上要求服务器在处理请求之前完全接收请求。如果 HTTP 请求未完成,或者传输速率很低,服务器就会一直占用资源等待其他数据。如果服务器占用过多资源,可能会导致目标主机拒绝服务。因为我们将阻止其他用户通过协议连接或创建会话。对任何一个允许HTTP访问的服务器,攻击者先在客户端上向该服务器建立一个content-length比较大的连接,然后通过该连接以非常低的速度(例如,1秒~10秒发一个字节)向服务器发包,并维持该连接不断开。如果攻击者在客户端上不断建立这样的连接,服务器上可用的连接将慢慢被占满,从而导致服务器拒绝用户正常的访问申请。

    简而言之,攻击者向网络服务器发送合法的 HTTP 请求头。在这些报文头中,正确指定了报文主体的大小。但是,信息主体的发送速度却非常慢。这种速度可以慢到每两分钟一个字节,但还不足以导致客户端-服务器传输超时,从而导致会话关闭。由于信息是正常处理的,目标服务器会尽力遵守规则,因此服务器的速度会随之大大降低。当攻击者同时发起数百甚至数千次 "慢速 HTTP "攻击时,服务器资源几乎在几秒钟内就会被消耗殆尽,导致合法客户端连接无法访问。 这类攻击很容易实施,因为使用最小带宽的单台机器可以在很短的时间内(最多 65539 次)建立数千个连接,产生数千个未完成的 HTTP 请求。

    可怕的是,这些攻击很难与正常流量区分开来。由于它们不需要应用层的大量资源,因此可以从一台计算机启动,这使得它们非常容易启动且难以缓解。传统的速度检测技术无法阻止此类攻击。也许一种方法是更新服务器的可用性,服务器上的可用连接越多(nginx 的 max_clients = worker_processes * worker_connections),攻击压垮该服务器的可能性就越小。不幸的是,在很多情况下,攻击者会简单地扩大攻击规模,试图尽可能多地超载。这些攻击可能就像耗时较长的合法请求,因此很难使用传统的反 DoS 工具进行检测和阻止。我给你留了一个纸条,通过这种攻击的页面:


工作原理
分析 HTTP GET 请求有助于更好地解释慢速 HTTP DoS 攻击如何以及为何可能发生。

一个简单的请求如下所示:

特别值得注意的是上述 GET 请求中的 [CRLF]。回车换行(CRLF)是一个不可打印字符,用于表示一行的结束。与文本编辑器类似,HTTP 请求会在行尾包含一个 [CRLF] 字符以开始新行,并包含两个 [CRLF] 字符(即 [CRLF] [CRLF])以指示空行。

HTTP 协议将空行定义为标头的结束。慢速 HTTP DoS 攻击就是利用了这一点,不发送尾部空行来完成报头。

更糟的是,入侵检测系统(IDS)通常检测不到慢速 HTTP DoS 攻击,因为这种攻击不包含恶意代码请求。在 IDS(入侵检测系统)看来,HTTP 请求是合法的,并会将其传递给网络服务器,而不会察觉到攻击。

开发
在对技术进行微调时,一个重要的信息是确定服务器上保持连接状态的最长时间(秒),这将使我们能够优化作为攻击者的资源。

一个 Python 脚本就能完成这项工作():

在第一次尝试中,我们的窗口大小是 75 秒,第 8 条调试信息告诉我们服务器关闭了连接,因此这不是我们的值,作为攻击者,我们将浪费 1 秒钟来启动另一个新连接。因此,我们用 74 秒进行了测试,成功地保持了会话的活力。

工具

docker pull shekyan/slowhttptest

根据这些测试,我们的命令将如下所示:

slowhttptest -c 65539 -H -g -o report.csv -i 10 -r 200 -t GET -u -x 74 -p 3 -l 1800

-c 65539 // 同时启动的最大连接数
-h // slowloris 模式 - 慢速 http
-g // 生成 CSV 和 HTML 格式的统计数据
-o report.csv // 自定义输出文件的路径和/或名称,如果指定了 -g 则有效
-i 10 // 每次会话发送信息的间隔时间(以秒为单位),这意味着 HTTP 会话打开后,将等待 10 秒发送信息,以此类推。
-r 200 // 连接比率,每次启动 200 个连接,它们是累积的,根据攻击服务器的处理速度,5 秒后我们将有 1000 个实时连接。
-t GET // 在攻击中使用的 HTTP 方法
-u
// 目标 URL,与在浏览器中输入的格式相同
-x 74 // 会话的最长持续时间,该值从第一次保持存活测试中获得
-3 // 请求探针,用于监控服务器在攻击期间是否正常响应,3 秒被设定为最长等待时间,如果在规定秒数后服务器没有响应,则认为服务器被 DoSed。
-l 1800 // 指定以秒为单位的攻击持续时间(本例中为 30 分钟)

请求探针的响应时间超过 3 秒,因此被视为 DoSed。

因此,我们将访问该网站,检查它是否如脚本所示在运行:

事实上,我们已经耗尽了服务器的资源,因此它不再接受合法连接,以至于主机注册的 DNS 服务显示路由进展顺利,直到它到达服务器并产生 HTTP 522 错误。522 代码代表连接超时,是在验证网络服务器和 DNS 之间的 TCP 连接是否相互同意时产生的。

更多



今天先到这儿,希望对云原生,技术领导力, 企业管理,系统架构设计与评估,团队管理, 项目管理, 产品管管,团队建设 有参考作用 , 您可能感兴趣的文章:

































如有想了解更多软件设计与架构, 系统IT,企业信息化, 团队管理 资讯,请关注我的微信订阅号:

作者:
出处:
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。 该文章也同时发布在我的独立博客中-Petter Liu Blog。

相关文章

最新评论