如何防止慢速HTTP请求攻击

最近线上出了一些和下载相关的问题,于是间接学习了下慢速HTTP请求攻击的问题。

参考自:

https://blog.qualys.com/vulnerabilities-research/2011/11/02/how-to-protect-against-slow-http-attacks

https://blog.qualys.com/vulnerabilities-research/2011/07/07/identifying-slow-http-attack-vulnerabilities-on-web-applications

介绍

慢速HTTP攻击是一种拒绝服务(DoS)攻击,攻击者将HTTP请求分成多段很小的一部分,然后缓慢地发送到Web服务器。如果HTTP请求不完整,或者传输速率非常低,服务器就会让其资源忙碌地等待其余的数据。当服务器的并发连接数达到最大值时,便形成了DoS攻击。缓慢的HTTP攻击很容易执行,因为攻击者只需要提供很少的资源,一台机器就能够建立数千个到服务器的连接,并且能够在非常短的时间内用最小的带宽生成数千个未完成的 HTTP 请求。

由于不同 HTTP 服务器之间的实现差异,存在两种主要的攻击载体:

  • Slowloris: 缓慢的发送HTTP的Header,使服务器一直等待最终的CRLF(CRLF表明Header部分的发送结束)

  • Slow POST: 缓慢发送HTTP的message body,使服务器等待直到内容发送长度达到Content-Length头的值。如果使用的是 HTTP 1.1,并且没有声明Content-Length,服务器会等待直到最终CRLF到达,

可怕的是,这些攻击看起来就像是需要很长时间的请求,所以很难通过使用传统的反dos工具来检测和防止它们。最近的谣言表明这些攻击正在发生:包括CIA.gov被slowloris进行攻击过。参考:https://gcn.com/Articles/2011/06/16/Rash-of-cyberattacks-preventable.aspx

slowhttptest

了解针对慢 HTTP DoS 攻击漏洞的新开源工具,写文章这哥们写了个 slowhttptest 工具。

Github:https://github.com/shekyan/slowhttptest

使用方式可以参考README, 或者文章https://blog.qualys.com/vulnerabilities-research/2011/09/19/testing-web-servers-for-slow-http-attacks

保护策略

在本文中,我将介绍几个简单的步骤,以防止慢速的HTTP攻击,并使攻击更难以执行。

  • 拒绝URL不支持的HTTP Methods(谓词)的连接
  • 将请求Header和Body限制在最小合理长度内。为每个特定的URL在接收请求时需要的资源上,增加更严格的限制
  • 如果可能,设置一个绝对连接超时。当然,如果超时时间太短,您可能会丢失合法的慢速连接; 如果超时时间太长,您将无法得到任何保护来抵御慢速攻击。我建议根据您的连接长度统计数据设置一个超时值,例如,超时值稍大于连接时长的中位数应该能够满足大多数合法客户端的需求
  • 待定连接的积压允许服务器在它还没有准备好接受连接时保留它,这使得它能够承受更大规模的慢速HTTP攻击,同时也可以对合法用户在高负载进行服务。然而,大量的积压也会延长攻击,因为它会积压所有的连接请求,而不管它们是否合法。如果服务器支持积压连接,建议将最大积压数设置得尽量大一些,以便HTTP服务器能够处理小型攻击。
  • 定义最小传入数据速率,以及低于该速率时的删除连接。必须小心不要设置太低的最低限度,否则你可能会丢失合法的连接

What’s Next

以上是最简单和最通用的对策,以尽量减少威胁。调优 Web 服务器配置在一定程度上是有效的,尽管在限制缓慢的 HTTP 攻击和合理地放弃缓慢的请求之间总是存在折衷。但永远不能仅仅使用上述技术来防止攻击。

除了配置 web 服务器,还可以实现其他保护层,比如事件驱动的软件负载均衡器(SLB)、执行延迟绑定的硬件LB,以及使用可疑模式丢弃连接的入侵检测/防御系统。

然而目前,在开发检测工具上,防御其他DDos攻击的工具可能比防慢速HTTP攻击更有意义。工具的弱点在于它可以在制定保护时被识别和利用。例如,一旦测试开始,slowhttptest不会更改用户代理字符串,并且它在每个HTTP请求中请求相同的URL。如果一个web服务器在短时间内从同一个IP接收到数千个连接,同一个用户代理请求相同的资源,这显然暗示着某些事情是不合法的。这些模式可以从日志文件中收集,因此监视日志文件以检测攻击仍然是最有效的对策。