# 微软的 IIS 安全辅助工具  URLScan 使用详解

- Link: https://www.xuepaijie.com/html/skill/devops/930.html
- Published: 2017-05-26T13:49:13+08:00
- Author: Admin

URLScan 是一款 IIS 的安全辅助工具，它可以帮助管理员来加强服务器的安全，它先于 IIS
对用户的请求进行处理，从而使得各项请求符合管理员的规则设置，极大的预防和封堵住各
项漏洞的利用和入侵。

**下载与安装**

最新版URLScan 3.1，支持IIS 5.1，IIS 6和IIS 7在Windows Vista和Windows Server 2008。

下载地址：https://www.iis.net/downloads/microsoft/urlscan

32位安装程序：urlscan_v31_x86.msi

64位安装程序：urlscan_v31_x64.msi

看系统位数选择安装程序，和一般软件一样安装，但是此软件不能选择安装路径，安装完成
以后，我们可以在System32/InetSvr/URLScan目录下找到以下文件：

    ```html;
    log：日志目录，开启日志记录功能，会在此目录下生成日志文件
    urlscan.dll：动态连接库文件
    urlscan.ini：软件配置文件，这个文件很重要，因为对URLScan的所有配置均有这个文件来完成
    ```

IIS管理 – 网站（右击属性） – ISAPI筛选器 – 点击添加 – 输入筛选器名称和添加可执行
文件dll（默认允许） – 点击确定即可，然后重启IIS即可生效。

**使用技巧**

1、以下两个选项需要设置为一，防止因编码、特殊文件夹导致的系统故障：

    ```html;
    [options]
    AllowHighBitCharacters=1 ;default is 0
    AllowDotInPath=1 ;default is 0
    ```

2、修复IIS短文件名漏洞:

    ```html;
    [DenyUrlSequences]
    ~
    *
    ```

3、一定程度上，修复跨站脚本漏洞，已过滤“<”、“>”

    ```html;
    [DenyQueryStringSequences]
    <
    >
    "
    '
    ```

4、某些情况下，无法通过msi进行urlscan的安装工作

请将urlscan文件夹复制到c:\windows\system32\inetsvr文件夹中，并在按上述中的IIS配置
即可。

5、修改或隐藏IIS的Server头信息

首先下载 UrlScan 。然后直接安装。安装以后进入IIS管理，功能视图里ISAPI筛选器里应有
UrlScan这一行。

然后修改配置文件内容：

    ```html;
    RemoveServerHeader=0
    AlternateServerName=WebProtect
    ```

注：在环境Windows 2008 Server R2 + IIS7.5上必须保证IIS角色下安装上ISAPI筛选器和IIS6
元数据库兼容性。

**配置修改**

URLScan 的所有配置都是通过 URLScan.ini 文件执行的，此文件位于System32\Inetsrv\URLscan
文件夹中。要配置 URLScan，请在文本编辑器（如记事本）中打开此文件，进行相应的更改
并保存此文件。

注意：要使更改生效，必须重新启动 Internet 信息服务 (IIS)。一种快速的实现方法是在
命令提示符处运行 iisreset。

urlscan配置文件必须是标准ini文件结构，也就是由节，串和值组成。

URLScan.ini 文件包含以下几节：

    ```html;
    [Options]：此节描述常规 URLScan 选项
    [AllowVerbs] 和 [DenyVerbs]：此节定义 URLScan 允许的谓词（又称作 HTTP 方法）
    [DenyHeaders]：此节列出 HTTP 请求中不允许的 HTTP 标头。如果 HTTP 请求中包含此节中列出的 HTTP 标头之一，URLScan 将拒绝该请求
    [AllowExtensions] 和 [DenyExtensions]：此节定义 URLScan 允许的文件扩展名
    [DenyURLSequences]：此节列出 HTTP 请求中不允许的字符串。URLScan 拒绝那些包含此节中出现的字符串的 HTTP 请求
    ```

我们将更详细地介绍每一节：

[Options] ：在 [Options] 节中，可以配置许多 URLScan 选项。此节中的每一行都具有以下
格式：

    ```html;
    OptionName=OptionValue
    ```

可用选项及其默认值如下所示：

    ```html;
    UseAllowVerbs=1
    ```

默认情况下，此选项设置为 1。如果将此选项设置为 1，则 URLScan 仅允许那些使用 [AllowVerbs]
节中列出的谓词的 HTTP 请求。URLScan 禁止任何不使用这些谓词的请求。如果将此选项设置
为 0，则 URLScan忽略 [AllowVerbs] 节，相反仅禁止那些使用 [DenyVerbs] 节中列出的谓
词的请求。

    ```html;
    UseAllowExtensions=0
    ```

默认情况下，此选项设置为 0。如果将此选项设置为 0，则 URLScan 禁止对 [DenyExtensions]
节中列出的文件扩展名的请求，但允许对任何其他文件扩展名的请求。如果将此选项设置为
1，则 URLScan 仅允许对带 [AllowExtensions] 节中列出的扩展名的文件的请求，而禁止对
任何其他文件的请求。

    ```html;
    NormalizeUrlBeforeScan=1
    ```

IIS 收到用 URL 编码的请求。这表示某些字符可能被替换为百分号 (%) 后跟特定的数字。
例如，%20 对应于一个空格，因此，对 http://myserver/My%20Dir/My%20File.htm 的请求
与对 http://myserver/My Dir/My File.htm 的请求是相同的。标准化就是对 URL 编码请求
进行解码的过程。默认情况下，此选项设置为 1。如果将 NormalizeUrlBeforeScan 选项设置
为 1，则 URLScan 分析已解码的请求。如果将此选项设置为 0，则 URLScan 分析未解码的
请求。将此选项设置为 0 会影响 URLScan 禁止某种攻击的能力。

    ```html;
    VerifyNormalization=1
    ```

由于百分号 (%) 本身可以是 URL 编码的，所以攻击者可以向服务器提交一个精心制作的、
基本上是双重编码的请求。如果发生这种情况，IIS 可能会接受本应视作无效而拒绝的请求。
默认情况下，此选项设置为1。如果将 VerifyNormalization选项设置为 1，则 URLScan 将
对 URL 执行两次标准化。如果第一次标准化后的 URL 与第二次标准化后的 URL 不同，URLScan
将拒绝该请求。这样就可以防止那些依赖双重编码请求的攻击。

    ```html;
    AllowHighBitCharacters=0
    ```

默认情况下，此选项设置为 0。如果将此选项设置为 0，则 URLScan 拒绝任何包含非 ASCII
字符的请求。这样可以防止某些类型的攻击，但同时可能也会禁止对某些合法文件的请求，
如带有非英文名的文件。

    ```html;
    AllowDotInPath=0
    ```

默认情况下，此选项设置为 0。如果将此选项设置为 0，则 URLScan 拒绝所有包含多个句点(.)
的请求。这样可以防止通过将安全的文件扩展名放入 URL 的路径信息或查询字符串部分，以
达到伪装请求中的危险文件扩展名的企图。例如，如果将此选项设置为 1，则 URLScan 可能
允许对http://servername/BadFile.exe/SafeFile.htm 的请求，因为它认为这是对 HTML 页
的请求，但实际上这是一个对可执行 (.exe) 文件的请求，而该文件的名称在 PATH_INFO 区域
中显示为 HTML 页的名称。如果将此选项设置为 0，URLScan 可能还会拒绝对包含句点的目录
的请求。

    ```html;
    RemoveServerHeader=0
    ```

默认情况下，Web 服务器返回一个标头，其中指出了 Web 服务器在所有响应中运行的 Web 
服务器软件。这会增加服务器遭受攻击的可能性，因为攻击者可以确定服务器正在运行 IIS，
于是便攻击已知的 IIS 问题，而不是试图使用为其他 Web 服务器设计的攻击手段来攻击 IIS
服务器。默认情况下，此选项设置为 0。如果将 RemoveServerHeader 选项设置为 1，可以
防止您的服务器发送将其标识为 IIS 服务器的标头。如果将 RemoveServerHeader 设置为 
0，则仍发送此标头。

    ```html;
    AlternateServerName=（默认情况下不指定）
    ```

如果将 RemoveServerHeader 设置为 0，可以在 AlternateServerName 选项中指定一个字符
串以指定将在服务器标头中传回的内容。如果将 RemoveServerHeader 设置为 1，则此选项
将被忽略。

    ```html;
    EnableLogging=1
    ```

默认情况下，URLScan 在 %WINDIR%\System32\Inetsrv\URLScan 中保留所有被禁止的请求的
完整日志。如果不希望保留此日志，可将 EnableLogging 设置为 0。

    ```html;
    PerProcessLogging=0
    ```

默认情况下，此选项设置为 0。如果将此选项设置为 1，URLScan 将为承载 URLScan.dll 的
每个进程创建一个单独的日志。如果将此选项设置为 0，所有进程将记录到同一个文件中。

    ```html;
    PerDayLogging=1
    ```

默认情况下，此选项设置为 1。如果将该值设置为 1，则 URLScan 每天创建一个新的日志文件。
每个日志文件的名称都是 Urlscan.MMDDYY.log，其中 MMDDYY 是日志文件的日期。如果将该
值设置为 0，则所有日志记录都保存在同一个文件中，与日期无关。

    ```html;
    AllowLateScanning=0
    ```

默认情况下，此选项设置为 0。如果将此选项设置为 0，则 URLScan 作为高优先级筛选器运行，
这表示它先于服务器上安装的所有其他 Internet 服务器应用程序编程接口 (ISAPI) 筛选器
执行。如果将此选项设置为1，则 URLScan 作为低优先级筛选器运行，以便其他筛选器可以
在 URLScan 进行任何分析之前修改URL。FrontPage Server Extensions (FPSE) 要求将此选项
设置为 1。

    ```html;
    RejectResponseUrl=（默认情况下不指定）
    ```

此选项指定在 URLScan 禁止请求时运行的文件的虚拟路径。这允许您自定义针对被禁止的请求
发送给客户机的响应。必须将 RejectResponseUrl 指定为相应文件的虚拟路径，如/Path/To/
RejectResponseHandler.asp。可以指定 URLScan 通常禁止的文件，如 Active Server Pages(
ASP)页。还可以从该页指定以下服务器变量：

    ```html;
    HTTP_URLSCAN_STATUS_HEADER：此变量指定请求被禁止的原因

    HTTP_URLSCAN_ORIGINAL_VERB：此变量指定被禁止的请求中的原始谓词（例如GET、POST、HEAD 或 DEBUG）

    HTTP_URLSCAN_ORIGINAL_URL：此变量指定被禁止的请求中的原始 URL
    ```

如果将 RejectResponseUrl 设置为特殊值 /~*，则 URLScan 使用“仅日志记录”模式。这允许
IIS 为所有请求提供服务，但它会在 URLScan 日志中为所有通常被禁止的请求添加相应的项。
这在需要测试 URLScan.ini 文件时很有用。

如果没有指定 RejectResponseUrl 的值，则 URLScan 使用默认值 /<Rejected-By-UrlScan
>。

    ```html;
    UseFastPathReject=0
    ```

默认情况下，此选项设置为 0。如果将此选项设置为 1，则 URLScan 忽略 RejectResponseUrl
设置并立即向浏览器返回 404 错误信息。这比处理 RejectResponseUrl 要快，但它允许的
日志记录选项没有那么多。如果将此选项设置为 0，则 URLScan 使用 RejectResponseUrl 
设置来处理请求。

[AllowVerbs] 节和 [DenyVerbs] 节

[AllowVerbs] 节和 [DenyVerbs] 节定义 URLScan 允许的 HTTP 谓词（又称作方法）。常用
的 HTTP 谓词包括GET、POST、HEAD 和 PUT。其他应用程序（如 FPSE 和 Web 分布式创作和
版本控制 (WebDAV)）使用更多的谓词。

[AllowVerbs] 节和 [DenyVerbs] 节的语法相同。它们由 HTTP 谓词列表组成，每个谓词占
一行。

URLScan 根据 [Options] 节中 UseAllowVerbs 选项的值来决定使用哪一节。默认情况下，
此选项设置为 1。如果将UseAllowVerbs 设置为 1，则 URLScan 仅允许那些使用 [AllowVerbs]
节中列出的谓词的请求。不使用任何这些谓词的请求将被拒绝。在这种情况下，[DenyVerbs]
节被忽略。

如果将 UseAllowVerbs 设置为 0，则 URLScan 拒绝那些使用 [DenyVerbs] 节中明确列出的
谓词的请求。允许任何使用未在此节中出现的谓词的请求。在这种情况下，URLScan 忽略 [
AllowVerbs] 节。

[DenyHeaders] 节
 当客户机向 Web 服务器请求页面时，它通常会发送一些包含有关此请求
的其他信息的 HTTP 标头。常见的HTTP 标头包括：

Host：此标头包含 Web 服务器的名称。

Accept：此标头定义客户机可以处理的文件类型。

User-Agent：此标头包含请求页面的浏览器的名称。

Authorization：此标头定义客户机支持的身份验证方法。

客户机可能会向服务器发送其他标头以指定其他信息。

在 [DenyHeaders] 节中，您定义 URLScan 将拒绝的 HTTP 标头。如果 URLScan 收到的请求
中包含此节中列出的任何标头，它将拒绝该请求。此节由 HTTP 标头列表组成，每个标头占
一行。标头名后面必须跟一个冒号 (:)（例如 Header-Name:）。

[AllowExtensions] 节和 [DenyExtensions] 节

大多数文件都有一个标识其文件类型的文件扩展名。例如，Word 文档的文件名一般以 .doc
结束，HTML 文件名一般以 .htm 或 .html 结束，纯文本文件名一般以 .txt 结束。[AllowExtensions]
节和 [DenyExtensions] 节允许您定义 URLScan 将禁止的扩展名。例如，您可以配置 URLScan
以拒绝对 .exe 文件的请求，防止 Web 用户在您的系统上执行应用程序。

[AllowExtensions] 节和 [DenyExtensions] 节的语法相同。它们由文件扩展名列表组成，
每个扩展名占一行。扩展名以句点 (.) 开头（例如 .ext）。

URLScan 根据 [Options] 节中 UseAllowExtensions 的值来决定使用哪一节。默认情况下，
此选项设置为 0。如果将UseAllowExtensions 设置为 0，则 URLScan 仅拒绝对 [DenyExtensions]
节中列出的文件扩展名的请求。允许此节中未列出的任何文件扩展名。[AllowExtensions] 
节被忽略。

如果将 UseAllowExtensions 设置为 1，则 URLScan 拒绝对 [AllowExtensions] 节中未明确
列出的任何文件扩展名的请求。仅允许对此节中列出的文件扩展名的请求。[DenyExtensions]
节被忽略。

有关如何配置 URLScan 以允许对没有扩展名的文件的请求的其他信息，以查看 Microsoft知识
库中相应的文章：如何配置 URLScan 以在 IIS 中允许使用空扩展名的请求。

[DenyUrlSequences] 节

可以配置 URLScan 以禁止那些 URL 中包含某些字符序列的请求。例如，可以禁止那些包含
两个连续句点 (..)的请求，利用目录遍历漏洞的攻击中经常采用这种手段。要指定一个想要
禁止的字符序列，请将此序列单独放在 [DenyUrlSequences] 节中的一行上。

请注意，添加字符序列可能会对 Microsoft Exchange 的 Outlook Web Access (OWA) 产生
负面影响。当您从 OWA打开一个邮件时，该邮件的主题行包含在服务器所请求的 URL 中。由于
URLScan.ini 文件禁止任何包含百分号 (%)和连字符 (&) 的请求，因此，当用户尝试打开主题
行为“Sales increase by 100%”或“Bob & Sue are coming to town”的邮件时，会收到 404
错误信息。要解决此问题，可以从 [DenyUrlSequences] 节中删除这些序列。请注意，这样
做会降低安全性，因为它有可能允许危险的请求到达服务器。

有关其他信息，以查看 Microsoft 知识库中相应的文章：URLScan 工具可能会导致 Outlook
Web Access 中出现问题。
