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 サーバーへの要求をすばやく記録して再生することができました。