使用请求筛选

作者:IIS 团队

介绍

UrlScan 是一款安全工具,作为早期版本的 Internet Information Services (IIS) 的加载项提供,它让管理员可以对其 Web 服务器强制实施更严格的安全策略。 在 IIS 7 及更高版本中,URLScan 的所有核心功能已合并到名为“请求筛选”的模块中,并添加了“隐藏段”功能。 本文介绍了请求筛选的每个功能,并举例说明如何在环境中应用该功能。

请注意,IIS 还包括用于 URL 重写的模块。 这两个模块之间存在差异:请求筛选针对安全方案进行设计和优化,而 URL 重写可以应用于广泛的方案(安全方案只是其中的一部分)。 有关差异的详细信息,请参阅 IIS 7.0 及更高版本的请求筛选和 URL 重写

筛选双编码请求

此功能可防止依赖于双编码请求的攻击,适用于攻击者向 IIS 提交精心制作的双编码请求时。 启用双编码请求筛选器后,IIS 会将 URL 规范化两次。如果第一个规范化不同于第二个,则请求会被拒绝,记录的错误代码为 404.11。 双编码的请求筛选器是 UrlScan 中的 VerifyNormalization 选项。

如果你不希望 IIS 允许服务双编码请求,请使用以下选项:

<configuration>
 <system.webServer> 
  <security>
   <requestFiltering
                  allowDoubleEscaping="false">
   </requestFiltering> 
  </security>
 </system.webServer>
</configuration>

筛选高位字符

此功能会允许或拒绝对包含非 ASCII 字符的对 IIS 的所有请求,并记录错误代码 404.12。 UrlScan 等效项为 AllowHighBitCharacters。

例如,假设你想要为一个应用程序而不是整个服务器允许高位字符。 在 ApplicationHost.config 文件中设置 allowHighBitCharacters="false";但在应用程序根目录中,创建一个 Web.config 文件,允许那一个应用程序接受非 ASCII 字符。 在 Web.config 文件中,使用:

<configuration>
 <system.webServer>
  <security>
   <requestFiltering
                  allowHighBitCharacters="true"
            >
   </requestFiltering>
  </security>
 </system.webServer>
</configuration>

基于文件扩展名进行筛选

此功能会定义允许 IIS 服务的一组文件扩展名。 当 IIS 根据文件扩展名拒绝请求时,记录的错误代码为 404.7。 AllowExtensions 和 DenyExtensions 选项是 UrlScan 等效项。

例如,假设你想要允许除 ASP 文件以外的每种类型的文件。 将 fileExtensions 的 allowUnlisted 选项设置为“true”,然后定义文件扩展名条目以显式拒绝 ASP:

<configuration>
 <system.webServer>
  <security>
   <requestFiltering>
    <fileExtensions allowUnlisted="true" >
     <add fileExtension=".asp" allowed="false"/>
    </fileExtensions>
   </requestFiltering>
  </security>
 </system.webServer>
</configuration>

根据请求限制进行筛选

此筛选器合并了三个功能(在 UrlScan 中具有相同的名称):

  • maxAllowedContentLength - 内容大小的上限
  • maxUrl - URL 长度的上限
  • maxQueryString - 查询字符串长度的上限

当 IIS 根据请求限制拒绝请求时,记录的错误代码为:

  • 413.1(如果内容太长)。
  • 404.14(如果 URL 太大)。
  • 404.15(如果查询字符串太长)。

例如,公司经常会购买他们没有源代码访问权限的软件。 随着时间的推移,他们可能会发现该代码中的漏洞。 获取受影响代码的更新通常不容易。 问题通常由过长的 URL 或查询字符串导致,或因发送到应用程序的内容过多。 确定安全上限后,可以使用以下配置应用限制,而无需修补应用程序二进制文件:

<configuration>
 <system.webServer>
  <security>
   <requestFiltering>
    <requestLimits
       maxAllowedContentLength="30000000"
       maxUrl="260"
       maxQueryString="25" 
                  />
   </requestFiltering>
  </security>
 </system.webServer>
</configuration>

按谓词筛选

此功能会定义 IIS 接受作为请求的一部分的谓词列表。 当 IIS 基于此功能拒绝请求时,记录的错误代码为 404.6。 这对应于 UrlScan 中的 UseAllowVerbs、AllowVerbs 和 DenyVerbs 选项。

例如,假设你只想只允许谓词 GET。 若要设置它,必须首先锁定配置,以便通过设置 allowUnlisted="false" 选项来禁止任何谓词。 接下来,列出想要显式允许的谓词,在本例中为 GET。

<configuration>
 <system.webServer>
  <security>
   <requestFiltering>
    <verbs
       allowUnlisted="false"
                  >
     <add verb="GET" allowed="true" />
    </verbs>
   </requestFiltering>
  </security>
 </system.webServer>
</configuration>

基于 URL 序列进行筛选

此功能会定义 IIS 作为请求的一部分时拒绝的序列列表。 当 IIS 拒绝对此功能的请求时,记录的错误代码为 404.5。这对应于 UrlScan 中的 DenyUrlSequences 功能。

这是一个非常强大的功能。 通过以下代码,可以彻底阻止 IIS 服务给定的字符序列:

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

在前面的示例中,'..' 序列被拒绝。 假如你从一家倒闭的供应商那里购买了一个应用程序,然后发现当一个给定的字符序列被发送到该应用程序时,它就会出现漏洞。 凭借此功能,只需将该 URL 序列添加到被拒绝列表即可保护该应用程序,而无需修补应用程序的代码。

筛掉隐藏段

此功能让你可以定义哪些段是“可服务的”。当 IIS 基于此功能拒绝请求时,记录的错误代码为 404.8。 此功能是 IIS 7 及更高版本的新增功能,它不是 UrlScan 的一部分。

请参考以下示例,其中一个服务器上有两个 URL:

http://site.com/bin

http://site.com/binary

假设你想要允许二进制目录中的内容,但不允许 bin 目录中的内容。 如果使用 URL 序列并拒绝序列“bin”,则你会拒绝对这两个 URL 的访问。 通过使用如下所示的配置,可以拒绝对 bin 的访问,同时仍服务二进制文件中的内容:

<configuration>
 <system.webServer>
  <security>
   <requestFiltering>
    <hiddenSegments>
     <add segment="BIN"/>
    </hiddenSegments>
   </requestFiltering>
  </security>
 </system.webServer>
</configuration>

IIS 7 及更高版本的错误代码

在以前的版本中,你可以在全局级别使用 UrlScan 来定义要在系统上强制实施的安全策略。 使用 IIS 7 及更高版本时,你仍然可在全局级别实现这些策略,但也可以按 URL 实施它们。 因此,你可以利用新的丰富委派模型提供的所有优势。

下表汇总了 IIS 日志的错误代码:

错误 状态代码
未找到站点 404.1
被策略拒绝 404.2
被 mime 映射拒绝 404.3
无处理程序 404.4
请求筛选:URL 序列被拒绝 404.5
请求筛选:谓词被拒绝 404.6
请求筛选:文件扩展名被拒绝 404.7
请求筛选:被隐藏段拒绝 404.8
由于已设置隐藏文件属性而被拒绝 404.9
请求筛选:由于 URL 双重转义而被拒绝 404.11
请求筛选:由于高位字符而被拒绝 404.12
请求筛选:由于 URL 太长而被拒绝 404.14
请求筛选:由于查询字符串太长而被拒绝 404.15
请求筛选:由于内容长度太大而被拒绝 413.1
请求筛选:由于请求头太长而被拒绝 431