0

asp.net アプリケーションには、セッション ハイジャックとセッション固定の問題があります。SSLも実装しています。

1.. web.config ファイルに以下のコードを追加しました。

<----

<httpCookies httpOnlyCookies="true" requireSSL="true"   />


  <forms loginUrl="Homepage.aspx"
      protection="All"
      timeout="20"
      name=".ASPXAUTH"
      path="/"
      requireSSL="true" 
      slidingExpiration="true"
      />

--->

2... フォームの認証チケットを暗号化し、ユーザーが認証された後に Cookie に追加します。

<---

FormsAuthenticationTicket tkt;

文字列 Cookiestr;

HttpCookie ck;

tkt = new FormsAuthenticationTicket(1, uname, DateTime.Now, DateTime.Now.AddMinutes(20),false, "カスタム データ");

cookiesstr = FormsAuthentication.Encrypt(tkt);

ck = 新しい HttpCookie(FormsAuthentication.FormsCookieName, cookiesstr); ck.Path = FormsAuthentication.FormsCookiePath;

Response.Cookies.Add(ck);

-->

3.. セッション変数を削除し、ログアウト ページとエラー ページで ASP.NET_SessionID に null 値を渡します。

SessionHandler.EndSession();

    Session.RemoveAll();

    Session.Abandon();

    Response.Cookies.Add(new HttpCookie("ASP.NET_SessionId", ""));


    if (Request.Cookies["ASP.NET_SessionId"] != null)
    {
        Response.Cookies["ASP.NET_SessionId"].Value = string.Empty;
        Response.Cookies["ASP.NET_SessionId"].Expires = DateTime.Now.AddMonths(-20);
    }

    if (Request.Cookies["AuthToken"] != null)
    {
        Response.Cookies["AuthToken"].Value = string.Empty;
        Response.Cookies["AuthToken"].Expires = DateTime.Now.AddMonths(-20);
    }

    HttpCookie authcookie = Request.Cookies[FormsAuthentication.FormsCookieName];
    authcookie.Expires = DateTime.Now.AddDays(-1D);
    Response.Cookies.Add(authcookie);
    FormsAuthentication.SignOut();

まだ問題は解決していません...

4

1 に答える 1

1
  1. 問題はセッションの乗っ取りですか、それとも認証の乗っ取りですか?
  2. ID を検証せずにセッション値を信頼していますか? (セッションと認証は、ASP.NET では本質的にリンクされていないことに注意してください)。
  3. SSL を実装しているのに、セッション Cookie がまだ に設定されているのはなぜrequireSSL="false"ですか?
  4. ベストプラクティスを調査し、どこが間違っているかを自分で確認してください。例 - http://www.troyhunt.com/2010/07/owasp-top-10-for-net-developers-part-3.html

ポイント2を詳しく説明します。

ここでは 2 つの Cookie が使用されています。1 つは 用Sessionで、もう1 つは 用ですFormsAuthentication。FormsAuth cookie はユーザーを識別し、これを安全に保つために適切なすべての手順を実行する必要があります。通常、SSL を要求することは良いステップです (例の編集で適用したように)。ただし、セッション Cookie は、多くの場合、開発者にとっては綿密な精査の対象にはなりませんが、使用方法によっては、同様に機密性が高くなる可能性があります。セッション固定は、認証ではなくセッションを盗みます。

例:

  1. UserA がログインします。彼らは管理者ユーザーです。「This is UserA」という FormsAuth Cookie を受け取り、「This User Is Admin」というセッションCookie を受け取ることもあります。
  2. UserB は、UserA に属するセッション Cookie のコピーを取得します (セッション Cookie がクリアされていない場合、UserA がログアウトした後、インターセプトを介して、または同じマシンにいるだけでこれを行うことができます)。
  3. ユーザー B がログインすると、「読み取り専用」ユーザー (管理者ではない) になります。「This is UserB」という FormsAuth Cookie を受け取り、ステップ 2 で盗んだセッション Cookieを挿入FormsAuthします。つまり、 「This is UserB」というSessionCookie と、「This User Is Admin」という Cookie があります。
  4. Presto、UserB が管理者になりました。

ここでの問題 (最初の懸念事項リストのポイント 2 に関連する) は、サーバーがそのセッションに関してユーザーの身元を確認しなかったことです。セッション認証チケットとフォーム認証チケットを何らかの方法でリンクして、暗号化 (SSL) していることを確認するために最善を尽くすことができます。または、機密データをセッションに保存するのをやめる (または少なくとも減らす) ことができます。上記の「このユーザーは管理者です」の例では、ASP.NET のロール プロバイダーとプロファイル プロバイダーをメンバーシップ プロバイダーと組み合わせて使用​​することをお勧めします。それらの 3 つは密接に関係しており、それらを有利に使用する方法については多くの例があります。

ただし、これは可能な調査の 1 つの行にすぎず、@JohnFx が正しく指摘したように、適切な回答を期待するには、ここで焦点を絞った質問が本当に必要です。セキュリティの実装に関しては、問題にサンプル コードを投げかけるだけでなく、関連する概念を理解することが重要です。これまでに提供されたサンプル コードは、セッション固定について説明している CodeProject の記事と疑わしいほど似ていますが、それが何を達成しようとしているのか理解できますか? それがあなたが経験している問題に当てはまるかどうか知っていますか?

于 2012-05-22T21:37:05.700 に答える