IIS headerWaitTimeout ssems 对慢速 HTTP 标头攻击没有影响
Posted
技术标签:
【中文标题】IIS headerWaitTimeout ssems 对慢速 HTTP 标头攻击没有影响【英文标题】:IIS headerWaitTimeout ssems to have no effect on slow HTTP header attacks 【发布时间】:2021-02-01 10:53:22 【问题描述】:我正在尝试提供一些形式的缓解或缓解使用 IIS 的慢速 HTTP POST 攻击。不幸的是,由于我们有许多绑定,很难用 nginx 替换 IIS 来提供传输速率控制。
通过使用连接超时属性,我在缓慢的 HTTP POST body 攻击中取得了部分成功。它似乎也会影响 Timer_EntityBody 所以如果在这么多秒(比如 20 秒)内没有在套接字上收到某些东西 - http.sys 将断开连接。
IIS 在应用程序主机级别有一个名为“headerWaitTimeout”的 webLimits 设置: https://docs.microsoft.com/en-us/iis/configuration/system.applicationhost/weblimits
旧版(网站默认设置):
https://docs.microsoft.com/en-us/iis/configuration/system.applicationhost/sites/sitedefaults/limits
它允许您设置客户端应发送所有 HTTP 标头的最长时间。我可以成功设置此值,但是在使用 Kali Linux 和“slowhttptest”进行测试时,它似乎没有任何效果。我还用wireshark验证了这种行为。
在我的 Windows 2012 R2 服务器上使用这个命令(IIS 8.5,但我怀疑这对于 WS 2019 上的 IIS 10 是一样的):
netsh http show servicestate
我可以看到我的主站点的应用程序池具有以下设置:
URL group ID: A10000024000000F
State: Active
Request queue name: MyMainAppPool (name changed..)
Properties:
Max bandwidth: inherited
Max connections: 5000
Timeouts:
Entity body timeout (secs): 45
Drain entity body timeout (secs): 45
Request queue timeout (secs): 65535
Idle connection timeout (secs): 45
Header wait timeout (secs): 0
Minimum send rate (bytes/sec): 0
Authentication Configuration:
Authentication schemes enabled:
Number of registered URLs: 2
Registered URLs:
HTTPS://*:443/
HTTP://*:80/
请注意请求 Q 超时时间很高(不知道为什么 - 在任何级别都找不到这个数字)并且标头等待超时始终为 0。 其他应用程序池正确地继承了这一点。例如:
Timeouts:
Entity body timeout (secs): 45
Drain entity body timeout (secs): 45
Request queue timeout (secs): 65535
Idle connection timeout (secs): 45
Header wait timeout (secs): 25
Minimum send rate (bytes/sec): 768
我需要一个关于下一步去哪里的线索和指针。 ETW 跟踪显示 http.sys 中的代码只是在等待新数据。如果有任何 Microsoft IIS 专家可以阐明此问题 - 请分享任何信息或指针。
谢谢, 以利
【问题讨论】:
预期。sitedefaults/limits
仅适用于您更改后创建的新站点。您必须设置现有站点的limits
。
是的,但 webLimits 是应用程序主机级别的部分。它应该将更改反映到 IIS 下的所有站点..所以行为很奇怪..
“它应该将更改反映到 IIS 下的所有站点”。不,不应该。再次阅读我上面所说的内容和 Microsoft 文档,docs.microsoft.com/en-us/iis/configuration/… 默认部分将无法反映到现有站点,因为您已经可以拥有特定于站点的设置。这就是为什么您的更改仅适用于更改后的新网站。
@LexLi - 我不是在谈论网站默认限制,但我现在意识到了混乱。我的链接不正确。我要更新它。我写的文字是指 applicationHost 部分下的 webLimits。
【参考方案1】:
嗯,这是最近才出现的。每当您尝试将问题暴露给医生时,似乎真的很害怕:-) 我发现了这个小宝石:
https://docs.microsoft.com/en-us/windows-server/networking/technologies/netsh/netsh-http
基本上,netsh http add timeout 允许你直接操作 http.sys 的 headerWaitTimeout。与 IIS webLimits 部分不同 - 这确实可以完成工作!
我能够在我的网站上设置 20 或 30 秒的超时时间(实际上这对机器来说是全局的......)并使用以下命令测试了 HTTP 标头攻击:
slowhttptest -c 1 -H -i 5 -r 200 -t POST -u http://<url to post>/.../ -p 30 -x 20 -l 120
(用于使用 Wireshark 捕获测试 1 个连接)
然后,当我将连接数移至 2000 时,我看到打开连接数的行为类似于电锯,这是人们所期望的。
Headers report
【讨论】:
以上是关于IIS headerWaitTimeout ssems 对慢速 HTTP 标头攻击没有影响的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Code::Blocks 上启用 SSE/SSE2?