是否允许双重逃逸危险?

Ale*_*lex 133 c# asp.net-mvc iis-7

我有一个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的一部分,但作为查询字符串的一部分接受.

有人可以解释并提供一些建议吗?

Eam*_*nne 154

编辑:增加了相关部分的重点.

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

要禁用检查,请执行以下操作(从此处开始):(请参阅下面的评论,了解双重转义的含义).

<system.webServer>
    <security>
        <requestFiltering allowDoubleEscaping="true"/>
    </security>
</system.webServer>
Run Code Online (Sandbox Code Playgroud)

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

最后,一个非常简单但有限的解决方法是简单地避免使用'+'并使用'%20'代替. 在任何情况下,使用"+"符号对空间进行编码都不是有效的url编码,而是特定于一组有限的协议,并且可能因向后兼容性原因而受到广泛支持.如果仅用于规范化目的,最好将空格编码为'%20'无论如何; 这很好地避开了IIS7问题(它仍然可以用于其他序列,例如%25ab.)

  • 如果一个uri被双重转义,那么未转义的uri组件可能自己包含保留字符,因此未转义的uri(部分)本身可能是有效的uri.简而言之,如果您使用未转义的uri字符串来构造新的uri - 特别是文件系统路径 - 并且您无法正确地转义新路径,则可以允许路径注入.路径注入可能允许攻击者欺骗您的程序处理它不应该处理的数据,或者让它混淆为认为两个uri在它们实际相同但只是编码方式不同时是不同的. (15认同)
  • @Stijn:**是的:那是安全的**.所有这些检查都会过滤掉可能被错误代码误解的请求(特别是如果你通过字符串连接双重解码或构建Uri并且没有正确的编码).您没有进行任何类型的处理,因此您自动安全.任何错误都需要在IIS的基本文件服务代码中,我认为我们可以安全地假设现在已经进行了非常非常彻底的战斗测试.再一次,这个检查没什么特别的,它只是对那些可能被*解码*然后看起来像*编码的*uri的东西保释. (4认同)
  • 我禁用了支票.这是一个麻烦,并没有为大多数应用程序提供额外的安全性. (3认同)
  • 你有一个链接/参考,禁用双重转义是非常安全的吗?此外,这种安全措施到底发生了什么? (3认同)
  • http://blogs.iis.net/thomad/archive/2007/12/17/iis7-rejecting-urls- contains.aspx (2认同)