慢速 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 秒进行了测试,成功地保持了会话的活力。
工具https://github.com/shekyan/slowhttptest
docker pull shekyan/slowhttptest
根据这些测试,我们的命令将如下所示:
slowhttptest -c 65539 -H -g -o report.csv -i 10 -r 200 -t GET -u https://targethost.com:443 -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 https://targethost.com:443 // 目标 URL,与在浏览器中输入的格式相同
-x 74 // 会话的最长持续时间,该值从第一次保持存活测试中获得
-3 // 请求探针,用于监控服务器在攻击期间是否正常响应,3 秒被设定为最长等待时间,如果在规定秒数后服务器没有响应,则认为服务器被 DoSed。
-l 1800 // 指定以秒为单位的攻击持续时间(本例中为 30 分钟)
请求探针的响应时间超过 3 秒,因此被视为 DoSed。
因此,我们将访问该网站,检查它是否如脚本所示在运行:
事实上,我们已经耗尽了服务器的资源,因此它不再接受合法连接,以至于主机注册的 DNS 服务显示路由进展顺利,直到它到达服务器并产生 HTTP 522 错误。522 代码代表连接超时,是在验证网络服务器和 DNS 之间的 TCP 连接是否相互同意时产生的。
更多
今天先到这儿,希望对云原生,技术领导力, 企业管理,系统架构设计与评估,团队管理, 项目管理, 产品管管,团队建设 有参考作用 , 您可能感兴趣的文章:
领导人怎样带领好团队
构建创业公司突击小团队
国际化环境下系统架构演化
微服务架构设计
视频直播平台的系统架构演化
微服务与Docker介绍
Docker与CI持续集成/CD
互联网电商购物车架构演变案例
互联网业务场景下消息队列架构
互联网高效研发团队管理演进之一
消息系统架构设计演进
互联网电商搜索架构演化之一
企业信息化与软件工程的迷思
企业项目化管理介绍
软件项目成功之要素
人际沟通风格介绍一
精益IT组织与分享式领导
学习型组织与企业
企业创新文化与等级观念
组织目标与个人目标
初创公司人才招聘与管理
人才公司环境与企业文化
企业文化、团队文化与知识共享
高效能的团队建设
项目管理沟通计划
构建高效的研发与自动化运维
某大型电商云平台实践
互联网数据库架构设计思路
IT基础架构规划方案一(网络系统规划)
餐饮行业解决方案之客户分析流程
餐饮行业解决方案之采购战略制定与实施流程
餐饮行业解决方案之业务设计流程
供应链需求调研CheckList
企业应用之性能实时度量系统演变
如有想了解更多软件设计与架构, 系统IT,企业信息化, 团队管理 资讯,请关注我的微信订阅号:
作者:Petter Liu
出处:http://www.cnblogs.com/wintersun/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
该文章也同时发布在我的独立博客中-Petter Liu Blog。