跳转到内容

揭秘“温柔的杀手”:慢速HTTP攻击与slowhttptest实战指南

资料:

一、什么是慢速HTTP攻击 (Slow HTTP Attack)?

传统的DDoS攻击像是一场“洪水猛兽”,通过巨大的流量堵塞服务器的带宽。而慢速HTTP攻击则完全不同,它像一个“温柔的杀手”或“耐心的无赖”,其目的不是耗尽服务器的带宽,而是耗尽服务器的连接资源(连接池)

一个生动的比喻: 想象一家餐厅(你的Web服务器)有10张桌子(10个并发连接数)。

  • 正常顾客:点餐、吃饭、买单、离开,整个过程很快,桌子可以快速流转给下一位顾客。
  • 慢速攻击者:坐到一张桌子前,然后每隔10分钟才对服务员说一个字来点菜("我...想...要...一...杯...水...")。服务员(服务器的工作线程)必须一直等着他点完菜,这张桌子也一直被他占用。如果同时来了10个这样的“无赖顾客”,餐厅的所有桌子都会被占满,并且长时间无法释放,导致任何新来的正常顾客都无法入座。

这就是慢速HTTP攻击的核心思想:以极慢的速度发送HTTP请求,让服务器误以为这是一个来自网速极慢的合法用户的请求,从而长时间保持连接,最终耗尽服务器的所有可用连接,导致其他正常用户无法访问,实现拒绝服务(DoS)

二、慢速攻击的三种主要实现路径

慢速攻击主要通过以下三种方式实现,slowhttptest工具也完整地支持了这三种模式的测试。

  1. 慢速请求头攻击 (Slow Headers / Slowloris型)

    • 原理:客户端与服务器建立连接后,开始发送HTTP请求头。但它并不一次性发完,而是以极慢的速度,一次只发送几个字节,或者每隔几十秒才发送一个请求头字段(如 X-a: b)。由于HTTP协议规定,请求头以一个空行(\r\n\r\n)作为结束标志,攻击者就一直不发送这个结束标志,导致服务器认为请求还没发完,被迫一直等待,占用一个连接。
  2. 慢速请求体攻击 (Slow Body / Slow POST型)

    • 原理:客户端先快速地发送完所有请求头,其中包含一个关键的Content-Length字段,告诉服务器将要发送一个很大长度的请求体(例如,上传一个大文件)。服务器收到后,便会分配资源准备接收这个请求体。然而,攻击者随后以极慢的速度,一次只发送一个字节的数据。服务器只能耐心地等待所有数据接收完毕,这个连接也因此被长时间占用。
  3. 慢速读取攻击 (Slow Read Attack)

    • 原理:这种方式反其道而行之。客户端发送一个完全正常的、合法的请求(例如,请求下载一个大文件)。服务器收到请求后,开始向客户端发送响应数据。但是,客户端故意设置一个极小的TCP接收窗口(TCP Receive Window),并以极慢的速度从缓冲区读取数据。这会迫使服务器的发送缓冲区被填满,进而阻塞住,导致服务器的这个连接也无法释放,因为它在等待客户端“有空”接收数据。

三、实战工具:slowhttptest 的详细用法

slowhttptest 是一款优秀的开源工具,专门用于模拟和测试服务器在慢速HTTP攻击下的表现。

安装 (以CentOS/Ubuntu为例):

bash
# CentOS/RHEL
sudo yum install epel-release
sudo yum install slowhttptest

# Ubuntu/Debian
sudo apt-get update
sudo apt-get install slowhttptest

基本参数说明:

  • -c <number>: 总连接数。模拟多少个“慢速顾客”。
  • -u <URL>: 目标URL。
  • -g: 生成统计数据,并以HTML和CSV格式保存。
  • -o <filename>: 指定输出文件的名称。
  • -i <seconds>: 在慢速攻击中,发送数据块之间的间隔时间(秒)。
  • -r <rate>: 每秒建立多少个新连接。
  • -t <verb>: 使用的HTTP方法,如 GET, POST
  • -p <seconds>: 等待服务器响应的超时时间,用于探测连接是否还活着。

示例:测试 http://127.0.0.1

以下是针对您提供的URL,覆盖三种攻击路径的具体示例。请在您自己的测试环境中执行,切勿攻击未授权的服务器。

示例1:慢速请求头攻击 (Slow Headers)

这个命令将模拟1000个客户端,以每10秒发送一点数据的速度,对目标发起慢速请求头攻击。

bash
slowhttptest -c 1000 -H -g -o slow_headers_test -i 10 -r 200 -t GET -u http://127.0.0.1/
  • -H: 关键参数,表示启用 Headers (慢速请求头) 模式。
  • -c 1000: 建立1000个并发连接。
  • -i 10: 每10秒发送一次数据片段。
  • -r 200: 每秒启动200个连接,直到达到1000个。
  • -o slow_headers_test: 输出结果文件名为 slow_headers_test.html/csv

示例2:慢速请求体攻击 (Slow Body)

这个命令将模拟1000个客户端,以极慢的速度发送POST请求的Body部分。

bash
slowhttptest -c 1000 -B -g -o slow_body_test -i 110 -r 200 -t POST -u http://127.0.0.1/ -x 24 -p 3
  • -B: 关键参数,表示启用 Body (慢速请求体) 模式。
  • -i 110: 间隔时间设置得非常长(110秒),因为服务器对Body的超时通常比Header更宽容。
  • -x 24: 每次发送24个字节的数据。
  • -p 3: 每隔3秒探测一次连接是否存活。

示例3:慢速读取攻击 (Slow Read)

这个命令将模拟1000个客户端,在发送正常请求后,以极慢的速度读取服务器的响应。

bash
slowhttptest -c 1000 -X -g -o slow_read_test -r 200 -u http://127.0.0.1/index.html -w 512 -n 5
  • -X: 关键参数,表示启用 Slow Read (慢速读取) 模式。
  • -u http://127.0.0.1/index.html: 最好指定一个实际存在的文件,以便服务器有内容可以响应。
  • -w 512: 此模式的核心,设置TCP接收窗口的起始大小为512字节。
  • -n 5: 每5秒从缓冲区读取一次数据。

四、如何解读测试结果

当 slowhttptest 运行时,你会看到实时的状态更新。测试结束后,打开生成的 .html 文件是查看结果最直观的方式。

你需要重点关注的状态是:service available: NO

如果这个状态显示为 NO,则意味着 slowhttptest 成功地使服务器无法响应新的连接,攻击成功。如果一直为 YES,说明你的服务器配置能够抵御这种强度的攻击。

在终端输出中,你还会看到连接状态的分布:

  • pending: 正在建立连接
  • connected: 连接已建立,并被成功“拖住”
  • error: 连接出错
  • closed: 连接已关闭

一个成功的攻击,其 connected 数量会很高且稳定,而 closed 数量会很低。

五、如何防御慢速HTTP攻击?

防御的核心思想是:尽快识别并断开这些“伪装”的慢速连接

  1. 调整Web服务器超时参数

    • Apache: 在 httpd.conf 中,调低 Timeout, KeepAliveTimeout, 特别是安装 mod_reqtimeout 模块并配置合理的 RequestReadTimeout
    • Nginx: 在 nginx.conf 中,调低 client_header_timeout, client_body_timeout, keepalive_timeoutsend_timeout
    • 注意: 超时时间不能设置得过低,否则会影响网络状况不佳的正常用户。这是一个权衡的过程。
  2. 限制连接速率和并发数

    • 使用模块如 Apache 的 mod_qos, mod_evasive 或 Nginx 的 limit_req_module, limit_conn_module 来限制单个IP的连接频率和并发连接数。
  3. 使用专业的防护设备/服务(最有效)

    • Web应用防火墙 (WAF): 硬件WAF或云WAF(如Cloudflare、阿里云WAF等)能非常有效地防御慢速攻击。它们的原理是作为反向代理,先完整地接收完客户端的请求,确认无误后再转发给后端的真实服务器。这样,慢速攻击的压力就完全被WAF承担了,真实服务器不会受到影响。

免责声明:本文提供的信息和工具仅用于学习、研究和授权测试目的。严禁使用本文内容对任何未授权的计算机系统进行攻击,否则后果自负。