4

HTTP トランザクションでの Host 値のスプーフィングで問題が発生しました。この種の攻撃に関連するセキュリティ ホールを閉じるには、実行中の ASP.NET サイトのドメインを安全に検出する必要があります。残念ながら、私が見つけたすべての参考文献は、Request.ServerVariables["HTTP_HOST"]またはを使用することを提案していますRequest.Url.Host。無効な HTTP パケットを送信することで、無効なホスト値を設定し、両方の関数呼び出しでそれらが引き起こしている動作を観察することができました。私が見ている動作は、使用している .NET 環境の種類によって異なります。

IIS 6 では、MVC コントローラー アクションでリクエストに直接アクセスするか、HttpContext.Current.Request.

Visual Studio 2012 ASP.Net 開発サーバーでは、NuGet パッケージを通じてプロジェクトにデプロイしたライブラリ コードに挿入された値しか表示されません。NuGet パッケージではHttpContext.Current、コードが Web アプリケーションの範囲外で実行されるため、 を使用する必要があります。Web アプリケーションの名前空間のスコープ内にとどまると、 を呼び出す必要がある場合でも、HttpContext.Currentスプーフィングされていない正しい値が提供されます。

このすべてのテストで、私は ASP.NET 4.0 を使用しています。この動作は ASP.NET 4.5 と IIS 8 で変更されましたか? ドメイン名を安全に取得する方法はありますか? PHP に対しても同じ攻撃を行うことができますが、Apache にはこの種の攻撃を防ぐ方法があります。IIS はありますか?

私が問題を抱えているコードの例:

string siteName1 = HttpContext.Current.Request.ServerVariables["HTTP_HOST"];
string siteName2 = HttpContext.Current.Request.Url.Host;

無効な HTTP パケットの例:

GET:  https://sampledomain.com/Items/Index
Host: fakedomain
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:19.0) Gecko/20100101 Firefox/19.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Cache-Control: max-age=0

Firefox 拡張機能のLive HTTP ヘッダーを使用してテストを行ったところ、Web サーバーへの要求をすばやく記録して再生することができました。

4

2 に答える 2

1

IIS では、サイトのバインディングをセットアップして、特定のホスト ヘッダー値に一致するリクエストのみを取得することができます。

そうすれば、誰かがホスト ヘッダーの値を偽装しようとしても、あなたの Web サイトはそのリクエストを見ることさえできません。

あなたの質問に対する正確な答えではありませんが、問題の解決策になる可能性があります。

于 2013-03-22T22:46:14.040 に答える
0

「安全に」とはどういう意味かは不明ですが、 Host ヘッダーの要点は、ブラウザが通信先のホストを指定できるようにすることです。

RFC 2616Request-URIには、 andHostヘッダーについて次のような記述があります。

HTTP の将来のバージョンですべてのリクエストで s への移行を許可するには 、HTTP/1.1 クライアントがプロキシへのリクエストでのみフォームを生成する場合でもabsoluteURI、すべての HTTP/1.1 サーバーがリクエストでフォームを受け入れなければなりません。absoluteURI

...

の最も一般的な形式はRequest-URI、オリジン サーバーまたはゲートウェイ上のリソースを識別するために使用される形式です。この場合、URI の絶対パスを として送信する必要があり (セクション 3.2.1 を参照abs_path) Request-URI、URI のネットワーク ロケーション (権限) をHostヘッダー フィールドで送信する必要があります。

...

  1. Request-URIが の場合absoluteURI、ホストは の一部です Request-URI。リクエストHostのヘッダー フィールドの値は無視する必要があります。

...

Hostフィールド値は、元の URL で指定されたオリジン サーバーまたはゲートウェイの命名機関を表す必要があります。これにより、オリジン サーバーまたはゲートウェイは、単一の IP アドレス上の複数のホスト名に対するサーバーのルート "/" URL など、内部的にあいまいな URL を区別できます。

...

クライアントは、Hostすべての HTTP/1.1 要求メッセージにヘッダー フィールドを含める必要があります。要求された URI に、要求されているサービスのインターネット ホスト名が含まれていない場合、Hostヘッダー フィールドには空の値を指定する必要があります。

...

クライアントとサーバーが要求ヘッダーをサポートし、要求ヘッダー (セクション 14.23) が HTTP/1.1 要求にHostない場合はエラーを報告し、Host 絶対 URI (セクション 5.1.2) を受け入れるという要件は、定義された最も重要な変更の 1 つです。この仕様によります。

...

  • クライアントとサーバーの両方がHostリクエスト ヘッダーをサポートする必要があります。
  • HTTP/1.1 リクエストを送信するクライアントは、Hostヘッダーを送信する必要があります。
  • HostHTTP/1.1 リクエストにリクエスト ヘッダーが含まれていない場合、サーバーは 400 (Bad Request) エラーを報告する必要があります。
  • サーバーは絶対 URI を受け入れなければなりません。

要約すると、準拠している HTTP クライアントはリクエストを送信できませんが、

GET https://example.com/ HTTP/1.1
Host: fakedomain.invalid

オリジンサーバーに対して、それを受け入れ、ホストとして使用し、ヘッダーを「無視」するには、HTTP/1.1 サーバーが必要です。間違いなくあるべきです。そうでない場合は、IIS のバグです。についてはあまり確信が持てませんが、ホストヘッダーを「無視」することの合理的な解釈は、それを書き換えて.example.comHostRequest.Url.Hostexample.comRequest.ServerVariables["HTTP_HOST"]example.com

(ちなみに、私がテストした他の 2 つのサーバーも仕様に従っていませんabsoluteURI。ヘッダーです。GET http://example.com/ HTTP/1.1)Host

于 2013-03-28T03:27:55.790 に答える