使用请求筛选
作者: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 |