セッションを何時間も読んで理解しようとした後、これが私の一般的な結論/見解です。
単純な (そして現実的な) 状況:
- 攻撃者は既存の Web サイト「website.example.com」を取得し、URL「9gag.com/?SID=1234」の背後にランダムな SID を挿入します。
- 攻撃者は、この URL を「フォーラム」に次のテキストとともに貼り付けます。
- 被害者は Web サイトを認識し、そこにアカウントを持っているため、指定された URL をすばやくクリックします。
- 被害者はサイトにアクセスしてログインします。
被害者は「9gag.com/?SID=1234」をクリックしてログインしたため、彼は現在、id=1234 のセッションにログインしています。すべてのセッションには一意の ID があることに注意してください。これは、サーバーが各セッションを個別に処理するために必要です。ただし、複数のコンピューターから同時に同じセッション (同じ ID を持つ) に参加することは可能です。
- 攻撃者は「9gag.com/?SID=1234」にもアクセスします。彼は現在、被害者と同じセッションに参加しています。これは、被害者としてログインしていることを意味します。彼はすべての被害者のアカウント設定を表示し、それらを変更できます。
これを防ぐために、このサイトのホストは次の PHP コードを使用できます。
<?php
session_start();
if (!isset($_SESSION['initiated']))
{
session_regenerate_id();
$_SESSION['initiated'] = TRUE;
}
?>
Initiated が true の場合 (つまり、ランダムな sessionID が生成された場合)、新しい sessionID は生成されません。それ以外の場合は、新しい sessionID を生成します。そのため、被害者が特定のセッション ID '1234' でログインすると、それを破棄して新しいものを生成します。攻撃者はそれを知らないため、あなたと同じセッション ID を取得できません。
攻撃者は賢く、別の方法を知っています。
- 攻撃者はサイトにアクセスしてログインします。PHP サーバーから新しいセッション ID が生成されています。
- 攻撃者は自分の COOKIES を調べて、受け取ったセッション ID を確認します。彼は SID='412e11d5' を見つけました
- 攻撃者は以前と同じ手順を実行しますが、「1234」の代わりに指定された ID を使用します。-> '9gag.com/?SID=412e11d5'
質問: これはどのように可能ですか?:
- $_SESSION['initiated'] は指定された ID に基づいていますか? ID「412e11d5」のセッションを使用するため、「initiated == true」ですか?
- 攻撃者が最初にセッションを作成しました。それ以外の場合、ID を生成できませんでした。では、被害者は、その逆ではなく、(アカウント設定で) 攻撃者のセッションに参加するべきではないでしょうか?
- セッションの固定は、多くの不運に基づいているようです。攻撃者は、被害者と同時に Web サイトにアクセスする必要があります。私はこれがどのように機能するのか理解していないと思います..
編集: クロスサイト クッキングを使用した攻撃:
- 攻撃者は、既存の Web サイト「9gag.com」の COOKIE に特定のセッション ID を格納する独自の Web サイト「evil.example.com」を作成します。
- 被害者は、他の例と同様に「evil.example.com」という URL をクリックします。「9gag.com」の COOKIE にセッション ID が保存されています。
- 被害者はその日のうちに「9gag.com」にログインします。
- 攻撃者は、固定されたセッション識別子を使用して被害者のアカウントを使用できるようになりました。
質問: 繰り返しますが、これはどのように可能ですか?:
- 攻撃者が別の Web サイトの COOKIE に何かを保存できる場合でも。どのように/いつ被害者と同じセッションに参加できますか? 同時にログインする必要はないようですか?それとも、別の方法で (セッション ID を使用して) 被害者の個人データを取得できますか?
私の部分からの誤解を修正してください!前もって感謝します。