web-dev-qa-db-ja.com

ASP.NETフォーム認証セッションがどのように別のサイトにリークする可能性がありますか?

あるサイトのフォーム認証が別のサイト内で使用される可能性がある脆弱性に対処しています。 IISまたはASP.NETでこれが発生するのを許可している方法がわかりません

手順:

  1. ユーザー「admin」としてsite1.domain.comにログインします。
  2. 認証Cookieの値を保存する
  3. Site2.domain.comに移動し、「EditThisCookie」拡張を使用して、手順2で一致する認証Cookieを作成します
  4. これを送信して、site1のcookieを使用してsite2の認証をバイパスします(site2に「admin」としてログインします。site1のエイリアスではなく、site2のデータを確認していることを確認します)

環境:

  • 1 IISサーバー(Windows 2016)
  • 2つのASP.NET4サイト(site1.domain.comおよびsite2.domain.com)
  • site1 Cookie名はSITE1_AUTH、site2 Cookie名はSITE2_AUTHです。
  • インプロセスセッションストレージの使用
  • site1とsite2に別々のアプリケーションプールを使用する
  • cookieは完全なドメインexを指定します:site1.domain.com(domain.comではない)
  • コードでは、FormsAuthentication.SetAuthCookie()を使用しています
  • site1とsite2は同じユーザーuser1を持っています

関連するASP.NET認証コードとweb.configを使用してこの問題を再現するために、ダミーのテストコードを作成しました。でもダミーコードでは再現できません。実際の(大規模な)アプリケーションでのみ機能します。そのため、関連するソースコードを共有することはできません。そのため、解決策としてのさらなる調査のためのヒントを受け入れることができます。

2
user3280964

最も可能性が高い理由は、machineKeyノードが各Webアプリケーションのweb.configに設定されており、ノードの両方に同じ値があることです。このノードには、認証Cookieを暗号化および復号化するためのキーが含まれています。デフォルトでは(ノードが存在しない場合)、サーバーはアプリケーションごとに一意のキーを作成します。ただし、machineKeyノードを指定した場合(たとえば、複数のWebサーバーを持つ単一のWebアプリケーションがあり、任意のノードで認証Cookieを作成または使用する必要がある場合)、指定したキーが使用されます。複数のWebアプリケーションで同じ値が使用された場合(または公開された場合)は、説明した状況に陥るため、脆弱性が生じる可能性があります。あるアプリケーションからの有効な任意の認証Cookieは、別のアプリケーションの偽造認証トークンとして再利用できます。

6
Xander