启用双重转义有危险吗?


136

我有一个ASP.NET MVC应用程序,它的路由允许通过/ search / <searchterm>搜索内容。

当我提供“ search / abc”时,效果很好,但是当我提供“ / search / a + b + c”(正确的url编码)时,IIS7拒绝请求,并显示HTTP错误404.11(请求过滤模块配置为拒绝包含双重转义序列的请求)。首先,为什么要这样做?如果它是URL的一部分,但似乎不是查询字符串的一部分,则似乎只会抛出错误(/ transmit?q = a + b + c可以正常工作)。

现在,我可以在web.config的安全性部分中启用双重转义请求,但是由于我不了解其含义,而且我也很犹豫这样做,服务器也为什么不将请求“ a + b + c”拒绝为URL的一部分,但接受为查询字符串的一部分。

有人可以解释并给出建议怎么办吗?


7
我还尝试了调用Server.Url Path Encode 的可能更正确的选项,并最终/search/a%2520b%2520c导致了标记,该标记导致一个可爱的“从客户端(%)检测到潜在的Request.Path值”错误。看来你赢不了。
扎夫-本·杜吉德(Ben Duguid)2011年

Answers:


158

编辑:在相关部分增加了重点。

基本上:IIS过于偏执。如果您没有对uri解码的数据做任何特别不明智的事情(例如通过字符串串联生成本地文件系统URI),则可以安全地禁用此检查。

要禁用该检查,请执行以下操作(从此处开始):(请参阅以下我的注释,以了解需要进行何种双重转义)。

<system.webServer>
    <security>
        <requestFiltering allowDoubleEscaping="true"/>
    </security>
</system.webServer>

如果加号在搜索输入中是有效字符,则需要启用“ allowDoubleEscaping”以允许IIS从URI的路径处理此类输入。

最后,一个非常简单的方法(如果受限制的话)只是避免使用“ +”,而是使用“%20”。 在任何情况下,使用'+'符号对空格进行编码都不是有效的url编码,而是特定于一组有限的协议,并且可能由于向后兼容的原因而受到广泛支持。如果仅出于规范化目的,最好还是将空格编码为'%20'。并且很好地避开了IIS7问题(对于其他序列,例如%25ab,它仍然可以冒出来)。


3
我要禁用支票。这很麻烦,并且不能为大多数应用程序提供额外的安全性。
Eamon Nerbonne 09年

3
您是否有一个链接/引用,禁用双重转义非常安全?另外,此安全措施到底能防止什么发生?
亚历克斯

15
如果uri被两次转义,则未转义的uri组件可能会包含保留字符,因此未转义的uri(的一部分)本身可能是有效的uri。简而言之,如果您使用未转义的uri字符串构造新的uri(尤其是文件系统路径),而您无法正确转义新路径,则可以允许路径注入。路径注入可以使攻击者诱骗您的程序处理其不应该处理的数据,或者使它们混淆,以至于当两个uri实际上相同但只是以不同的编码方式时,它们就认为是不同的。
Eamon Nerbonne 09年


4
@Stijn:是的,那很安全。所有这些检查所做的只是过滤掉可能被错误代码误解的请求(特别是如果您通过string-concat双重解码或构建Uri,而没有正确的编码)。您无需进行任何类型的处理,因此对于您而言,这几乎是自动安全的。任何错误都必须存在于IIS的基本文件服务代码中,我认为我们可以放心地假设,到目前为止,这已经经过了非常非常全面的测试。同样,此检查没什么花哨的,它只是基于可能被解码的东西,然后看起来像一个编码的 uri。
Eamon Nerbonne

2

我只想在Eamon Nerbonne的答案中添加一些与您的问题的“ 做什么 ”部分相关的信息(不解释原因)。 您也可以轻松更改特定应用程序的设置

  1. 使用管理员权限打开控制台(开始-cmd-右键单击,以管理员身份运行)
  2. 输入以下内容(从此处获取:http : //blogs.iis.net/thomad/archive/2007/12/17/iis7-rejecting-urls- contains.aspx):

    %windir%\system32\inetsrv\appcmd set config "YOURSITENAME" -section:system.webServer/security/requestfiltering -allowDoubleEscaping:true

    (例如YOURSITENAME,您可以替换Default Web Site为将此规则应用于默认网站)

  3. 输入,准备好了。

一个例子:

  1. 首先我有同样的问题: HTTP错误404.11-请求过滤模块配置为拒绝包含双重转义序列的请求。
  2. 输入上述文字: Drupal7-另一个 HTTP错误404.11的解决方案-请求过滤模块配置为拒绝包含双转义序列的请求。
  3. 现在它可以按预期工作: HTTP错误404.11的解决方案-请求过滤模块配置为拒绝包含双转义序列的请求。

1

您是否考虑过使用类似“ / search / a / b / c”的搜索网址?

您需要设置一条路线,例如

search/{*path}

然后从操作中的路径字符串中提取搜索值。


查尔斯· HTH


问题在于其他URL编码字符(包括“ /”本身)可能是搜索的一部分。
亚历克斯

您是否可以将实际上属于搜索的所有'/'编码为'%2F'?
Charlino

0

我在IIS 7.5下在应用程序中执行Server.TransferRequest()时遇到了这一问题。

对文件名进行编码会导致两次转义问题,但是如果不对文件名进行编码,则会遇到 “潜在危险的Request.Path”错误。

在我传递给Server.TranferRequest()的URL上放置任何协议,甚至是空协议,都可以解决此问题。

不起作用:

context.Server.TransferRequest("/application_name/folder/bar%20bar.jpg");

作品:

context.Server.TransferRequest("://folder/bar%20bar.jpg");
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.