URL シーケンスの拒否 <denyUrlSequences>

  • 概要
  • 互換性
  • セットアップ
  • 方法
  • 構成
  • サンプル コード

※本ページに挿入されている画像をクリックすると、画像全体が別ウィンドウで表示されます。

概要

<denyUrlSequences> 要素には <add> 要素のコレクションが含まれ、IIS で拒否する文字列のシーケンスを指定します。これにより、Web サーバーに対する URL ベースの攻撃を防ぐことができます。

たとえば、URL 内に 2 つのピリオド ("..") を使用すると、サーバーにその URL を直近の上位ディレクトリで処理するように指示できますが、これにより攻撃者がコンテンツ領域以外の領域にアクセスしようとする可能性も考えられます。そこで、この文字列のパターンをブロックすることで、攻撃者がこの URL シーケンスを悪用する機会を排除することができます。

: 拒否対象の URL シーケンスにより、要求のフィルタリングが HTTP 要求をブロックすると、IIS 7.0 は HTTP 404 エラーをクライアントに返し、要求が拒否された理由を特定する固有の副状態と共に次の HTTP 状態をログに記録します。

HTTP 副状態 説明
404.5 URL シーケンスが拒否されました

この副状態により、Web 管理者が IIS ログを分析し、潜在的な脅威を識別できるようになります。

互換性

  IIS 7.0 IIS 6.0
注意 <requestFiltering> コレクションの <denyUrlSequences> は IIS 7.0 で新たに導入された要素です。 <denyUrlSequences> 要素は、IIS 6.0 の UrlScan の DenyUrlSequences 機能に代わるものです。

セットアップ

IIS 7.0 の既定のインストールには、"要求のフィルタリング" 役割サービスが含まれます。"要求のフィルタリング" 役割サービスがアンインストールされている場合、次の手順を使用して再インストールできます。

Windows Server 2008

  1. タスク バーで [スタート] ボタンをクリックし、[管理ツール] をポイントして [サーバー マネージャー] をクリックします。

  2. [サーバー マネージャー] ウィンドウのツリー表示で、[役割] を展開して [Web サーバー (IIS)] をクリックします。

  3. [Web サーバー (IIS)] ウィンドウで、[役割サービス] セクションまでスクロールして [役割サービスの追加] をクリックします。

  4. 役割サービスの追加ウィザードの [役割サービスの選択] ページで、[要求フィルタ] を選択して、[次へ] をクリックします。

    拡大

  5. [インストール オプションの確認] ページで [インストール] をクリックします。

  6. [結果] ページで [閉じる] をクリックします。

Windows Vista

  1. タスク バーで [スタート] ボタンをクリックし、[コントロール パネル] をクリックします。

  2. コントロール パネルで、[プログラムと機能][Windows の機能の有効化または無効化] の順にクリックします。

  3. [Internet Information Services][World Wide Web サービス][セキュリティ] の順に展開します。

  4. [要求のフィルタリング] を選択して、[OK] をクリックします。

    拡大

方法

: このセクションの手順では、要求のフィルタリング用のユーザー インターフェイスが含まれている Microsoft Administration Pack for IIS 7.0 をインストールしている必要があります。Microsoft Administration Pack for IIS 7.0 をインストールするには、次の URL を参照してください。

http://learn.iis.net/page.aspx/415/

URL シーケンスを拒否する方法

  1. タスク バーで [スタート] ボタンをクリックし、[管理ツール] をポイントして [インターネット インフォメーション サービス (IIS) マネージャー] をクリックします。

  2. [接続] ウィンドウで、要求のフィルタリング設定を変更する接続、サイト、アプリケーション、またはディレクトリに移動します。

  3. [ホーム] ウィンドウで [Request Filtering] をダブルクリックします。

    拡大

  4. [Request Filtering] ウィンドウで、[URL] タブをクリックし、[操作] ウィンドウの [Deny Sequence...] をクリックします。

    拡大

  5. [Deny Sequence] ダイアログ ボックスで、ブロックする URL シーケンスを入力し、[OK] をクリックします。

    拡大

    たとえば、サーバーに対するディレクトリ トラバーサルを防ぐには、ダイアログ ボックスに 2 つのピリオド ("..") を入力します。

構成

属性

なし。

子要素

要素 説明
add オプションの要素。

シーケンスを拒否対象の URL シーケンスのコレクションに追加します。
clear オプションの要素。

<denyUrlSequences> コレクションからシーケンスへのすべての参照を削除します。
remove オプションの要素。

<denyUrlSequences> コレクションから 1 つのシーケンスへの参照を削除します。

構成サンプル

次の例の Web.config ファイルでは、3 つの URL シーケンスへのアクセスを拒否します。1 つ目のシーケンスはディレクトリ トラバーサル、2 つ目のシーケンスは代替データ ストリームへのアクセス、3 つ目のシーケンスは URL 内での円記号の使用をそれぞれ防ぎます。

<configuration>
   <system.webServer>

      <security>
         <requestFiltering>
            <denyUrlSequences>
               <add sequence=".." />
               <add sequence=":" />
               <add sequence="\" />

            </denyUrlSequences>
         </requestFiltering>
      </security>
   </system.webServer>
</configuration>

サンプル コード

次のコード サンプルでは、Default Web Site に対して 3 つの URL シーケンス (ディレクトリ トラバーサル ("..")、代替データ ストリーム (":")、円記号 ("\")) へのアクセスが拒否されます。

AppCmd.exe

appcmd.exe set config "Default Web Site" -section:system.webServer/security/requestFiltering /+"denyUrlSequences.[sequence='..']" 

appcmd.exe set config "Default Web Site" -section:system.webServer/security/requestFiltering /+"denyUrlSequences.[sequence=':']" 

appcmd.exe set config "Default Web Site" -section:system.webServer/security/requestFiltering /+"denyUrlSequences.[sequence='\']" 

C#

using System;
using System.Text;
using Microsoft.Web.Administration;

internal static class Sample
{
   private static void Main()
   {
      using (ServerManager serverManager = new ServerManager())
      {
         Configuration config = serverManager.GetWebConfiguration("Default Web Site");

         ConfigurationSection requestFilteringSection = config.GetSection("system.webServer/security/requestFiltering");

         ConfigurationElementCollection denyUrlSequencesCollection = requestFilteringSection.GetCollection("denyUrlSequences");

         ConfigurationElement addElement = denyUrlSequencesCollection.CreateElement("add");
         addElement["sequence"] = @"..";
         denyUrlSequencesCollection.Add(addElement);

         ConfigurationElement addElement1 = denyUrlSequencesCollection.CreateElement("add");
         addElement1["sequence"] = @":";
         denyUrlSequencesCollection.Add(addElement1);

         ConfigurationElement addElement2 = denyUrlSequencesCollection.CreateElement("add");
         addElement2["sequence"] = @"\";
         denyUrlSequencesCollection.Add(addElement2);

         serverManager.CommitChanges();
      }
   }
}

VB.NET

Imports System
Imports System.Text
Imports Microsoft.Web.Administration

Module Sample

Sub Main()
      Dim serverManager As ServerManager = New ServerManager
      Dim config As Configuration = serverManager.GetWebConfiguration("Default Web Site")
      Dim requestFilteringSection As ConfigurationSection = config.GetSection("system.webServer/security/requestFiltering")
      Dim denyUrlSequencesCollection As ConfigurationElementCollection = requestFilteringSection.GetCollection("denyUrlSequences")

      Dim addElement As ConfigurationElement = denyUrlSequencesCollection.CreateElement("add")
      addElement("sequence") = ".."
      denyUrlSequencesCollection.Add(addElement)

      Dim addElement1 As ConfigurationElement = denyUrlSequencesCollection.CreateElement("add")
      addElement1("sequence") = ":"
      denyUrlSequencesCollection.Add(addElement1)

      Dim addElement2 As ConfigurationElement = denyUrlSequencesCollection.CreateElement("add")
      addElement2("sequence") = "\"
      denyUrlSequencesCollection.Add(addElement2)

      serverManager.CommitChanges()
   End Sub

End Module

JavaScript

var adminManager = new ActiveXObject('Microsoft.ApplicationHost.WritableAdminManager');
adminManager.CommitPath = "MACHINE/WEBROOT/APPHOST/Default Web Site";
var requestFilteringSection = adminManager.GetAdminSection("system.webServer/security/requestFiltering", "MACHINE/WEBROOT/APPHOST/Default Web Site");
var denyUrlSequencesCollection = requestFilteringSection.ChildElements.Item("denyUrlSequences").Collection;

var addElement = denyUrlSequencesCollection.CreateNewElement("add");
addElement.Properties.Item("sequence").Value = "..";
denyUrlSequencesCollection.AddElement(addElement);

var addElement1 = denyUrlSequencesCollection.CreateNewElement("add");
addElement1.Properties.Item("sequence").Value = ":";
denyUrlSequencesCollection.AddElement(addElement1);

var addElement2 = denyUrlSequencesCollection.CreateNewElement("add");
addElement2.Properties.Item("sequence").Value = "\\";
denyUrlSequencesCollection.AddElement(addElement2);

adminManager.CommitChanges();

VBScript

Set adminManager = WScript.CreateObject("Microsoft.ApplicationHost.WritableAdminManager")
adminManager.CommitPath = "MACHINE/WEBROOT/APPHOST/Default Web Site"
Set requestFilteringSection = adminManager.GetAdminSection("system.webServer/security/requestFiltering", "MACHINE/WEBROOT/APPHOST/Default Web Site")
Set denyUrlSequencesCollection = requestFilteringSection.ChildElements.Item("denyUrlSequences").Collection

Set addElement = denyUrlSequencesCollection.CreateNewElement("add")
addElement.Properties.Item("sequence").Value = ".."
denyUrlSequencesCollection.AddElement(addElement)

Set addElement1 = denyUrlSequencesCollection.CreateNewElement("add")
addElement1.Properties.Item("sequence").Value = ":"
denyUrlSequencesCollection.AddElement(addElement1)

Set addElement2 = denyUrlSequencesCollection.CreateNewElement("add")
addElement2.Properties.Item("sequence").Value = "\"
denyUrlSequencesCollection.AddElement(addElement2)

adminManager.CommitChanges()