RequestFiltering 不适用于 MS-DOS 设备名称路径

RequestFiltering not working for MS-DOS device name paths

我试图安抚我们最近发生的 PCI 扫描失败,其中指出:

Microsoft ASP.NET MS-DOS Device Name DoS

Synopsis : A framework used by the remote web server has a denial of service vulnerability. Impact: The web server running on the remote host appears to be using Microsoft ASP.NET, and may be affected by a denial of service vulnerability. Requesting a URL containing an MS-DOS device name can cause the web server to become temporarily unresponsive.

简而言之,我们在我们的应用程序上访问 URL,例如 /AUX/.aspx,我们收到 500 错误。

我正在使用 RequestFiltering 来过滤掉这些请求,并且 return 404 而不是服务器尝试处理请求。

我的 web.config 摘录如下:

<system.webServer>
    <security>
        <requestFiltering>
            <denyUrlSequences>
                <add sequence="/AUX/.aspx" />
            </denyUrlSequences>
        </requestFiltering>
    </security>
</system.webServer>

但是,这不起作用,它仍在 return500。

我希望它 return 404。

如果我将以下包罗万象的 url 添加到 denyUrlSequences,那么整个站点都会产生预期的 404。

<add sequence="/" />

值得一提的是,该应用程序是 IIS 7.5 (Windows 2008 R2)

上的 MVC 应用程序 运行

刚好要解决这个问题。

我的解决方案是禁用 .Net 错误页面并启用 IIS 错误页面。

当您将自定义错误处理从较高的 .Net 级别移动到较低的 IIS 级别时,HTTP 响应代码从 500 更改为 404。

PCI 测试通过:-)

我自己为此苦苦挣扎了一段时间。我认为 500 响应代码对于 URL 中的 MS-DOS 名称是正确的,您不需要添加任何内容来请求过滤。

您会注意到,如果您使用任何 MS-DOS 名称 (https://support.microsoft.com/en-us/kb/74496) 而不对您的配置做任何操作,您将收到 500 错误。但是,如果您为其他内容添加 RequestFiltering denySequence,例如 "foo",那么您将在浏览到 /foo.

时看到 404.5 错误

如果您将 relaxedUrlToFileSystemMapping="true" 添加到 httpRuntime element 以及您的请求过滤 denySequence 条目,那么对于 MS-DOS 名称,您将获得 404.5。

但是禁用默认的 asp.net 配置只是为了让您可以得到除 500 响应之外的其他内容 URL 与 MS-DOS 名称是来自 PCI 合规性检查的可笑请求。