IIS headerWaitTimeout ssems对缓慢的HTTP标头攻击没有影响

问题描述

我试图提供某种缓解或缓解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/zh-cn/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专家,请共享任何信息或指针。

谢谢, 以利

解决方法

嗯,这是最近才出现的。似乎每当您尝试向医生暴露问题时,他们都会感到害怕:-) 我发现了这个小宝石:

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...