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?

SSE:质量整数转换+SSE 比 FPU 慢?

SSE、SSE2、SSE3指令集的区别?

sse2浮点乘法

在 Visual Studio 中检测 SSE/SSE2 指令集的可用性

为啥 SSE 和 AVX 具有相同的效率?