揭秘“温柔的杀手”:慢速HTTP攻击与slowhttptest实战指南
资料:
一、什么是慢速HTTP攻击 (Slow HTTP Attack)?
传统的DDoS攻击像是一场“洪水猛兽”,通过巨大的流量堵塞服务器的带宽。而慢速HTTP攻击则完全不同,它像一个“温柔的杀手”或“耐心的无赖”,其目的不是耗尽服务器的带宽,而是耗尽服务器的连接资源(连接池)。
一个生动的比喻: 想象一家餐厅(你的Web服务器)有10张桌子(10个并发连接数)。
- 正常顾客:点餐、吃饭、买单、离开,整个过程很快,桌子可以快速流转给下一位顾客。
- 慢速攻击者:坐到一张桌子前,然后每隔10分钟才对服务员说一个字来点菜("我...想...要...一...杯...水...")。服务员(服务器的工作线程)必须一直等着他点完菜,这张桌子也一直被他占用。如果同时来了10个这样的“无赖顾客”,餐厅的所有桌子都会被占满,并且长时间无法释放,导致任何新来的正常顾客都无法入座。
这就是慢速HTTP攻击的核心思想:以极慢的速度发送HTTP请求,让服务器误以为这是一个来自网速极慢的合法用户的请求,从而长时间保持连接,最终耗尽服务器的所有可用连接,导致其他正常用户无法访问,实现拒绝服务(DoS)。
二、慢速攻击的三种主要实现路径
慢速攻击主要通过以下三种方式实现,slowhttptest工具也完整地支持了这三种模式的测试。
慢速请求头攻击 (Slow Headers / Slowloris型)
- 原理:客户端与服务器建立连接后,开始发送HTTP请求头。但它并不一次性发完,而是以极慢的速度,一次只发送几个字节,或者每隔几十秒才发送一个请求头字段(如
X-a: b
)。由于HTTP协议规定,请求头以一个空行(\r\n\r\n
)作为结束标志,攻击者就一直不发送这个结束标志,导致服务器认为请求还没发完,被迫一直等待,占用一个连接。
- 原理:客户端与服务器建立连接后,开始发送HTTP请求头。但它并不一次性发完,而是以极慢的速度,一次只发送几个字节,或者每隔几十秒才发送一个请求头字段(如
慢速请求体攻击 (Slow Body / Slow POST型)
- 原理:客户端先快速地发送完所有请求头,其中包含一个关键的
Content-Length
字段,告诉服务器将要发送一个很大长度的请求体(例如,上传一个大文件)。服务器收到后,便会分配资源准备接收这个请求体。然而,攻击者随后以极慢的速度,一次只发送一个字节的数据。服务器只能耐心地等待所有数据接收完毕,这个连接也因此被长时间占用。
- 原理:客户端先快速地发送完所有请求头,其中包含一个关键的
慢速读取攻击 (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攻击?
防御的核心思想是:尽快识别并断开这些“伪装”的慢速连接。
调整Web服务器超时参数:
- Apache: 在
httpd.conf
中,调低Timeout
,KeepAliveTimeout
, 特别是安装mod_reqtimeout
模块并配置合理的RequestReadTimeout
。 - Nginx: 在
nginx.conf
中,调低client_header_timeout
,client_body_timeout
,keepalive_timeout
和send_timeout
。 - 注意: 超时时间不能设置得过低,否则会影响网络状况不佳的正常用户。这是一个权衡的过程。
- Apache: 在
限制连接速率和并发数:
- 使用模块如 Apache 的
mod_qos
,mod_evasive
或 Nginx 的limit_req_module
,limit_conn_module
来限制单个IP的连接频率和并发连接数。
- 使用模块如 Apache 的
使用专业的防护设备/服务(最有效):
- Web应用防火墙 (WAF): 硬件WAF或云WAF(如Cloudflare、阿里云WAF等)能非常有效地防御慢速攻击。它们的原理是作为反向代理,先完整地接收完客户端的请求,确认无误后再转发给后端的真实服务器。这样,慢速攻击的压力就完全被WAF承担了,真实服务器不会受到影响。
免责声明:本文提供的信息和工具仅用于学习、研究和授权测试目的。严禁使用本文内容对任何未授权的计算机系统进行攻击,否则后果自负。