二重エスケープを有効にすることは危険ですか?


136

/ search / <searchterm>を介して検索できるルートを持つASP.NET MVCアプリケーションがあります。

「search / abc」を指定するとうまく機能しますが、「/ search / a + b + c」(正しくURLエンコードされた)を指定すると、IIS7はHTTPエラー404.11でリクエストを拒否します(リクエストフィルタリングモジュールは、二重エスケープシーケンスを含むリクエスト)。まず、なぜこれを行うのですか?URLの一部である場合にのみエラーをスローするようですが、クエリ文字列の一部ではありません(/ transmit?q = a + b + cは正常に動作します)。

これで、web.configのセキュリティセクションでダブルエスケープリクエストを有効にできますが、影響を理解できず、サーバーがリクエスト "a + b + c"を拒否する理由もわからないため、そうすることをためらっています。 URLの一部ですが、クエリ文字列の一部として受け入れます。

誰かが何をすべきかを説明し、いくつかのアドバイスを与えることができますか?


7
また、Server.Url Path Encode を呼び出すというより適切なオプションを試したところ、/search/a%2520b%2520cマークアップになってしまい、「潜在的に危険なRequest.Path値がクライアントから検出されました(%)」というエラーが発生しました。勝てないようです。
Zhaph-Ben Duguid、

回答:


158

編集:関連セクションに強調を追加しました。

基本的に:IISは過度に偏執的です。uriでデコードされたデータで特に賢明なことを何もしていない場合(文字列連結によるローカルファイルシステムURIの生成など)は、このチェックを安全に無効にできます。

このチェックを無効にするには、次の手順を実行します(ここから):(ダブルエスケープの結果については、以下のコメントを参照してください)。

<system.webServer>
    <security>
        <requestFiltering allowDoubleEscaping="true"/>
    </security>
</system.webServer>

プラス記号が検索入力で有効な文字である場合は、「allowDoubleEscaping」を有効にして、IISがURIのパスからのそのような入力を処理できるようにする必要あります。

最後に、「+」を避けて代わりに「%20」を使用するのが限られた回避策である場合、非常に単純です。 いずれの場合も、「+」記号を使用してスペースをエンコードすると、有効なURLエンコードませんが、限られたプロトコルセットに固有であり、おそらく下位互換性の理由から広くサポートされています。正規化のみを目的とする場合は、スペースを '%20'としてエンコードする方が良いでしょう。これはIIS7の問題をうまく回避します(これは、%25abなどの他のシーケンスでも発生する可能性があります)。


3
チェックを無効にします。それは面倒であり、ほとんどのアプリに追加のセキュリティを提供しません。
イーモンネルボンヌ2009

3
ダブルエスケープを無効にしても安全なリンク/参照はありますか?また、このセキュリティ対策は正確に何を防ぐのですか?
Alex

15
URIがダブルエスケープされている場合、エスケープされていないURIコンポーネントには予約文字が含まれている可能性があるため、エスケープされていないURI(の一部)自体が有効なURIである可能性があります。つまり、エスケープされていないURI文字列を使用して新しいURI(特にファイルシステムパス)を構築し、新しいパスを正しくエスケープできない場合は、パスインジェクションを許可できます。パスインジェクションにより、攻撃者はプログラムをだましてデータを処理させたり、2つのURIが実際には同一であるが単にエンコードが異なる場合に2つのURIが異なると混乱させたりする可能性があります。
Eamon Nerbonne、2009


4
@Stijn:はい:安全です。このチェックで行われるのは、バグのあるコードによって誤って解釈される可能性のあるリクエストをフィルターで除外することです(適切なエンコードを行わずにstring-concatを使用してUriをダブルデコードまたはビルドする場合は特に)。あなたはどんな種類の処理もしていませんので、それはあなたの側でほとんど自動的に安全です。IISの基本的なファイルサービスコードにはバグが含まれている必要があります。これまでに、非常に徹底的にテストされていると考えて間違いありません。繰り返しになりますが、このチェックは特別なものではなく、デコードされエンコードされた URIのように見える可能性のあるものに基づいています。
Eamon Nerbonne 2014

2

質問の「何をすべきか」の部分に関連するEamon Nerbonneの回答にいくつかの情報を追加したいと思います(理由の説明ではありません)。 特定のアプリケーションの設定も簡単に変更できます

  1. 管理者権限でコンソール開く(スタート-cmd-右クリック、管理者として実行)
  2. 次のように入力します(ここから取得:http : //blogs.iis.net/thomad/archive/2007/12/17/iis7-rejecting-urls-taining.aspx):

    %windir%\system32\inetsrv\appcmd set config "YOURSITENAME" -section:system.webServer/security/requestfiltering -allowDoubleEscaping:true

    (たとえば、このルールをデフォルトのWebサイトに適用YOURSITENAMEするDefault Web Siteためにで置き換えることができます)

  3. 入りましょう。

例:

  1. 最初に私は同じ問題を抱えていました: HTTPエラー404.11-リクエストフィルタリングモジュールは、ダブルエスケープシーケンスを含むリクエストを拒否するように設定されています。
  2. 上記のテキストを入力: Drupal7-another HTTPエラー404.11の解決策-リクエストフィルタリングモジュールは、ダブルエスケープシーケンスを含むリクエストを拒否するように設定されています。
  3. 今では期待どおりに動作します: HTTPエラー404.11の解決策-リクエストフィルタリングモジュールは、ダブルエスケープシーケンスを含むリクエストを拒否するように設定されています。

1

「/ search / a / b / c」のような検索URLを使用することを考えましたか?

次のようなルートを設定する必要があります

search/{*path}

次に、アクションのパス文字列から検索値を抽出します。

HTHs
チャールズ


問題は、他のURLエンコード文字(「/」自体を含む)が検索の一部になる可能性があることです。
Alex

検索の一部であるすべての「/」を「%2F」にエンコードできませんか?
チャーリーノ2009

0

アプリケーションでServer.TransferRequest()を実行しているIIS 7.5でこれに遭遇しました。

ファイル名をエンコードすると二重エスケープの問題が発生しましたが、エンコードしないと、 「潜在的に危険なRequest.Path」エラーが発生します。

空のプロトコルであっても、Server.TranferRequest()に渡すURLに任意のプロトコルを配置すると、問題が解決しました。

動作しません:

context.Server.TransferRequest("/application_name/folder/bar%20bar.jpg");

作品:

context.Server.TransferRequest("://folder/bar%20bar.jpg");
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.