慢速POST攻击的核心手法就是利用HTTP分块传输编码,把请求体拆成极小数据块,每隔一段时间才发送一个块,让服务器在等待完整请求的过程中耗尽连接池资源。 这种攻击不追求高流量,而是靠长时间占用连接,对中小型Web服务器尤其致命,下面直接说清楚它的原理、排查方法、防御配置和成本。
慢速POST攻击分块拖延请求完成时间的基本原理
分块传输编码怎么变成拖延工具
HTTP协议里,客户端发送POST请求时通常用Content-Length告诉服务器请求体有多长,服务器收满对应字节数后就交给后端处理,但HTTP/1.1还支持Transfer-Encoding: chunked分块传输模式,设计初衷是客户端在不知道总长度时也能边生成边发送。
攻击者恰恰利用了这种“不知道总长、必须等结束标志”的机制,具体操作如下:
- 发送POST请求行和请求头,声明
Transfer-Encoding: chunked。 - 每个数据块格式为:十六进制长度行 + 数据内容 + CRLF换行。
- 攻击者声明第一个块只有1字节,发送后再也不发下一个块,或者每隔20秒、30秒才发1个字节。
- 服务器每收到一个块就会重置读超时计数器,只要攻击者赶在超时前再发一点点数据,连接就永远不会断。
- 一台攻击机可以同时开启数百甚至上千条这样的慢速连接,每条连接都占住服务器的一个线程或进程。
- 服务器的最大并发连接数是固定的,当所有连接被慢速请求占满后,正常用户就连不上来了。
一个典型攻击请求长什么样
攻击者发出的请求可能像下面这样:
POST /login HTTP/1.1 Host: target.com User-Agent: Mozilla/5.0 Transfer-Encoding: chunked Content-Type: application/x-www-form-urlencoded 1 a
然后停顿20秒,再发送:
1 b
再停顿,反复循环,服务器始终等待请求结束标志0rnrn,也就是一个长度为0的空块,只要攻击者不发送这个结束块,请求就一直处于不完整状态,连接被长期挂起。
对比正常的分块请求,客户端会在短时间内连续发送所有数据块,最后紧跟0rnrn表示结束,两者的差别不在请求头,而在数据块的发送节奏。
慢速POST攻击和CC攻击有什么区别?分块拖延请求完成时间的手法拆解
资源消耗层面:连接数 vs 请求频率
慢速POST攻击和传统CC攻击虽然都叫应用层攻击,但消耗资源的侧重点完全不一样。
- 慢速POST攻击:消耗的是服务器的并发连接数、线程/进程数、内存和文件描述符,单请求流量可能只有几十字节,却占住连接几十秒甚至几分钟。
- CC攻击:多数依赖高频率请求消耗CPU、带宽、数据库连接,每个请求正常完成,但请求量极大。
- 一台带宽很小的攻击机就能发起有效的慢速POST攻击,因为总流量很低;而CC攻击通常需要较大的带宽或代理资源。
流量特征层面:低频低速 vs 高频高速
从外部流量监控来看,两者差异明显:
- 慢速POST:连接数很高,但每个连接的数据速率极低,总带宽可能只有几百KB/s,波形平缓。
- CC攻击:请求速率高,每秒请求数飙涨,流量波形呈现明显尖峰。
| 维度 | 慢速POST攻击 | 传统CC攻击 |
|---|---|---|
| 单请求速率 | 极低,字节级间隔发送 | 高,瞬时大量请求 |
| 主要消耗资源 | 连接数、线程、内存 | CPU、带宽、后端数据库 |
| 流量特征 | 总带宽低,连接持续时间长 | 总带宽高,短连接多 |
| 检测难度 | 较隐蔽,容易误判为慢客户端 | 较明显,但可多层防护 |
为什么分块拖延比普通慢速POST更难防
普通慢速POST可能只发送请求头后缓慢发送body,但分块方式让攻击者可以动态调整每个块的大小和发送间隔,比如先发1个字节,隔10秒发1个字节,再隔5秒发2个字节,部分WAF如果没有在边缘完整缓冲请求体,很难判断这是正常弱网用户还是攻击者,行业共识认为,分块传输编码的灵活性天然增加了检测难度,尤其是对依赖特征匹配的传统安全设备。
服务器被慢速POST攻击怎么排查:从连接状态看端倪
查看当前连接数和状态
假设你的网站突然访问变慢,SSH登录服务器后发现CPU和内存占用都不高,但网页就是打不开,这时可以优先怀疑连接数被占满。
用以下命令查看当前80端口的连接数:
ss -tan state established '( sport = :80 or sport = :443 )' | wc -l
如果连接数接近Nginx或Apache配置的上限,比如达到几百甚至上千,而正常业务平时只有几十,基本可以确认有大量异常连接。
再用这条命令按源IP统计连接数:
ss -tan state established '( sport = :80 or sport = :443 )' | awk '{print $4}' | cut -d: -f1 | sort | uniq -c | sort -rn | head -20
如果某个IP的连接数异常高,且单个连接持续时间很长,就要重点排查。
分析访问日志中的异常POST请求
Nginx日志默认会记录请求方法、路径、状态码和请求时长,在日志中筛选POST请求:
grep 'POST' /var/log/nginx/access.log | awk '{print $1, $NF, $7}'
重点关注以下几点:
- 大量来自同一IP的POST请求,状态码为
408(请求超时)或499(客户端提前关闭)。 - 请求体大小只有几十字节,但请求时长超过10秒甚至更长。
- 请求头中出现
Transfer-Encoding: chunked,且日志中看不到请求完成时间。
如果日志里成片出现“POST /login HTTP/1.1”后面状态码是408,同时来源IP相对集中,慢速POST攻击的可能性就很大。
用tcpdump抓包确认分块拖延
对可疑IP进行抓包,观察POST请求体的发送节奏:
tcpdump -i eth0 host 可疑IP -A -s 0
如果看到客户端每10秒、30秒才发送几个字节,并且持续几分钟不结束,基本可以判定为分块拖延请求完成时间的慢速POST攻击,正常用户即使网络慢,也不会以这种极低频率持续发送数据块。
慢速POST攻击防御方案多少钱?不同层级成本对比
免费配置层:Nginx/Apache参数调优
对于个人站长或小企业,优先使用Web服务器自带的超时和连接数限制,成本为0。
Nginx核心配置如下:
client_body_timeout 5s; client_header_timeout 5s; client_max_body_size 2m; limit_conn_zone $binary_remote_addr zone=perip:10m; limit_conn perip 10;
client_body_timeout是防御慢速POST最直接的参数,表示两次连续读操作之间的超时时间,攻击者如果每10秒发1个字节,设置为5秒后连接就会被强制关闭。limit_conn限制单IP并发连接数,避免单IP占用全部资源。
Apache 2.4可以启用mod_reqtimeout模块:
RequestReadTimeout header=5-10,MinRate=500 body=5-10,MinRate=500
含义是:header和body阶段前5秒允许慢速,之后要求最低接收速率500字节/秒,同时设置Timeout 30和LimitRequestBody 2000000控制总请求时长和请求体大小。
这一层适合技术能力较强的运维,但调参需要重启服务,且参数过严可能误伤弱网移动用户,需要在安全和体验之间平衡。
商业WAF/CDN层:按流量或按站点计费
国内主流云厂商的WAF服务基础版月付通常在几十元到几百元之间,支持慢速攻击防护规则,CDN加速服务自带边缘缓冲,能把慢速POST请求拦截在源站之外,源站只接收完整请求。
按流量计费时,慢速POST攻击总流量低,但部分厂商按连接时长或请求数计费时可能产生额外费用,购买前需要确认计费项,北京地区多家云服务商的WAF产品功能相近,价格差异主要体现在防护规则更新频率和售后响应速度上。
高防IP/硬件设备层:价格区间
高防IP服务通常按防护峰值和带宽计费,基础防护包月从数百元到数千元不等,硬件防火墙设备一次性投入较大,适合对延迟敏感、合规要求高的企业,北京地区的机房托管或高防服务价格略高于全国平均水平,但线路质量和防护稳定性更可靠。
业内专家指出,多数中小网站用免费配置加商业CDN的组合就能有效缓解慢速POST攻击,不必一开始就上硬件设备。
北京服务器防慢速POST攻击的实操配置
Nginx关键配置参数
在北京服务器上部署Nginx时,建议在http或server块中加入以下参数:
client_body_timeout 5s; client_header_timeout 5s; client_max_body_size 2m; send_timeout 10s; keepalive_timeout 30; limit_conn_zone $binary_remote_addr zone=perip:10m; limit_conn perip 10; limit_req_zone $binary_remote_addr zone=postzone:10m rate=5r/s; limit_req zone=postzone burst=10 nodelay;
client_header_timeout防止攻击者在请求头阶段缓慢发送头部。limit_req限制单IP的POST请求速率,超过后返回503或跳转验证码,北京机房的服务器通常带宽充足,但连接数上限受操作系统文件描述符限制,建议同时调高
ulimit -n。
Apache关键配置参数
如果使用Apache,需要确认mod_reqtimeout已启用:
a2enmod reqtimeout
然后在虚拟主机或全局配置中写入:
RequestReadTimeout header=5-10,MinRate=500 body=5-10,MinRate=500 Timeout 30 LimitRequestBody 2000000
RequestReadTimeout的MinRate表示最低接收速率,低于这个速率就断开连接。LimitRequestBody限制请求体最大2MB,防止攻击者声明超大分块,北京地区使用Apache的站长相对较少,但配置逻辑与Nginx一致。
应用层代码防护
除了服务器参数,应用层也可以增加防护:
- 对登录、表单提交等POST接口,在入口处校验请求体大小,超过合理范围直接拒绝。
- 在反向代理层开启请求体缓冲,只有完整接收后再转发给后端,后端就不会被慢速连接拖住。
- 对单个IP的POST请求频率做限制,超过阈值触发验证码或临时封禁,阻断自动化攻击。
- 使用CDN时,开启“源站卸载”或“请求缓冲”功能,让边缘节点替源站承受慢速连接。
慢速POST攻击看似温吞,但它利用协议设计上的等待机制,能把一台服务器的并发连接资源慢慢抽干,核心防御思路就一条:不让服务器无限期等待不完整的请求体,无论是调小读超时、限制请求体大小,还是通过CDN边缘缓冲,本质上都是给服务器的耐心设一个上限,这个上限加上连接数限制,就能把分块拖延请求完成时间的杀伤力降到大半。
慢速POST攻击分块拖延请求完成时间怎么防御?
核心是缩短读超时并限制并发连接,Nginx设置client_body_timeout 5s和limit_conn,Apache启用mod_reqtimeout设置最低接收速率,同时在边缘节点部署CDN或WAF缓冲完整请求体,三层配合可以防止单IP慢速连接耗尽服务器资源,其中读超时是第一道也是最有效的防线。
慢速POST攻击和慢速headers攻击哪个更难防?
两者都依赖HTTP协议的等待特性,慢速headers攻击发送不完整的请求头,服务器等待header结束;慢速POST攻击利用分块传输拖延请求体,慢速headers攻击更难通过应用层参数区分,因为请求头阶段很多WAF还未介入,但通过client_header_timeout和连接层速率限制同样可以缓解,相对而言,慢速POST攻击的可观测性略高,因为请求行已经暴露了POST方法和Transfer-Encoding头,日志排查时更容易定位。
北京服务器防慢速POST攻击的收费模式是怎样的?
北京地区云服务商的WAF基础版多数按包月或按带宽计费,月费从几十元到数百元不等,带有慢速攻击防护功能,高防IP服务按防护峰值计费,基础套餐一般数百元起,如果选择服务器托管并自行部署开源防护,只需承担服务器和带宽成本,但需要自己维护规则和参数,多数情况下,免费层加商业CDN的组合已经能满足中小网站的防护需求。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/637379.html





