IIS headerWaitTimeout SSEM对慢速HTTP标头攻击没有影响

IIS headerWaitTimeout SSEM对慢速HTTP标头攻击没有影响,http,security,post,iis,denial-of-service,Http,Security,Post,Iis,Denial Of Service,我正试图提供某种形式的缓解或缓解针对IIS的缓慢HTTP POST攻击。不幸的是,由于我们有许多绑定,用nginx替换IIS以提供传输速率控制将非常困难 通过使用连接超时属性,我在缓慢的HTTP POST正文攻击方面取得了部分成功。它似乎也会影响Timer_EntityBody,因此如果套接字在那么多秒(比如20秒)内没有接收到任何内容,http.sys将断开连接 IIS在应用程序主机级别具有名为“headerWaitTimeout”的webLimits设置: 旧(网站默认设置): https

我正试图提供某种形式的缓解或缓解针对IIS的缓慢HTTP POST攻击。不幸的是,由于我们有许多绑定,用nginx替换IIS以提供传输速率控制将非常困难

通过使用连接超时属性,我在缓慢的HTTP POST正文攻击方面取得了部分成功。它似乎也会影响Timer_EntityBody,因此如果套接字在那么多秒(比如20秒)内没有接收到任何内容,http.sys将断开连接

IIS在应用程序主机级别具有名为“headerWaitTimeout”的webLimits设置:

旧(网站默认设置): https://docs.microsoft.com/en-us/iis/configuration/system.applicationhost/sites/sitedefaults/limits

它允许您设置客户端发送所有HTTP头的最长时间。我可以成功地设置这个值,但在使用Kali Linux和“slowhttpest”进行测试时,它似乎没有任何效果。我还用wireshark验证了这种行为

在我的Windows 2012 R2服务器上使用此命令(IIS 8.5,但我怀疑在WS-2019上的IIS 10也是如此):

我可以看到我的主站点的应用程序池具有以下设置:

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中的代码,只是等待新数据。如果有任何微软IIS专家可以解释这个问题-请分享任何信息或指针

谢谢,
Eli

嗯,这是最近才出现的。当你试图将问题暴露给医生时,他们似乎真的很害怕:——) 我发现了这个小宝石:

基本上,netsh http add timeout允许您直接操作http.sys的headerWaitTimeout。与IISwebLimits部分不同,这实际上完成了任务

我能够在我的站点上设置20或30秒的超时(实际上这是机器的全局超时…),并使用以下命令测试HTTP标头攻击:

slowhttptest -c 1 -H -i 5 -r 200 -t POST -u http://<url to post>/.../ -p 30 -x 20 -l 120
slowhttpest-c1-H-i5-r200-tpost-uhttp:///.../ -p 30-x 20-l 120
(用于测试1个带有Wireshark capture的连接)

然后,当我将连接计数移动到2000时,我看到了一个链锯式的行为,即打开连接的数量,这是人们所期望的


预期<代码>站点默认值/限制仅适用于更改后创建的新站点。您必须设置现有站点的
限制。是的,但webLimits是应用程序主机级别的一个部分。它应该将更改向下反映到IIS下的所有站点。。所以这种行为很奇怪.“它应该反映出IIS下所有站点的变化”。不,不应该。再次阅读我上面所说的内容和Microsoft文档,默认值部分将无法反映到现有站点,因为您已经可以拥有特定于站点的设置。这就是为什么您的更改只适用于更改后的新站点。@LexLi-我不是在谈论站点默认限制,但我现在意识到了混淆。我的链接不正确。我要更新它。我写的文本是指applicationHost部分下的webLimits。
slowhttptest -c 1 -H -i 5 -r 200 -t POST -u http://<url to post>/.../ -p 30 -x 20 -l 120