Shikata Ga Nai

Private? There is no such things.

LAB: パスワードリセットポイズニングの基本

Hello there, ('ω')ノ

概要

このラボは、パスワードリセット機能にホストヘッダーインジェクションの脆弱性が存在するケースを扱います。ユーザー「carlos」は、受け取ったメール内のリンクを無条件でクリックしてしまいます。この脆弱性を利用して、carlosのアカウントにログインすることが本ラボの目的です。

目標

パスワードリセットポイズニング攻撃を使用して、carlosのアカウントにログインしてください。

手順

1. 自分のアカウントでパスワードリセットを試す

  • ログインページへアクセスし、「Forgot your password?」リンクをクリック。
  • ユーザー名「wiener」でパスワードリセットをリクエスト。
  • Exploitサーバのメールクライアントで、リセットメールを確認。
  • メール内のリンク(temp-forgot-password-token付き)をクリックし、新しいパスワードを設定。

2. ホストヘッダーが任意の値を受け付けるか確認

  • Burp SuiteでHTTP履歴からPOST /forgot-passwordリクエストを確認。
  • Repeaterに送信し、Hostヘッダーを任意のドメインに変更して送信。
  • Exploitサーバのメールクライアントで、リンクに指定したドメインが反映されていることを確認。

3. Carlos宛のリセットリンクを悪意あるドメインで送信

  • RepeaterでHostヘッダーを自分のExploitサーバのドメイン(YOUR-EXPLOIT-SERVER-ID.exploit-server.net)に変更。
  • ユーザー名を「carlos」に変更してリクエストを送信。

4. トークンを取得してcarlosのパスワードを変更

  • Exploitサーバのアクセスログを確認し、リクエストに含まれているtemp-forgot-password-tokenを取得。
  • 最初に受信した自分用のリセットURLを参考に、トークンをcarlos用に置き換えてアクセス。
  • 新しいパスワードを設定し、carlosとしてログイン。

攻略のコツとポイント

  • Hostヘッダーを変更してもアプリが正しく動作するかを常に確認。
  • Exploitサーバは、リセットリンクが開かれることでトークンを収集する役割を果たす。
  • Carlosのように不用意にリンクを開くユーザーの存在は、攻撃成功率を高める要因となる。

解説

このラボでは、アプリケーションがHostヘッダーの内容を信頼してパスワードリセットリンクを生成しているという実装ミスを突きます。本来、リンク生成においてドメインはサーバ側で安全に定義された値を使うべきで、リクエストヘッダーのようなユーザー制御が可能な値に依存すべきではありません。

対策

  • リセットリンク生成には、サーバー設定ファイルに定義したドメインを使用。
  • Hostヘッダーの内容は必ずバリデーションし、ホワイトリストに含まれるドメインのみ許可。
  • X-Forwarded-Hostなどのオーバーライド用ヘッダーも無効化または検査する。

Best regards, (^^ゞ