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, (^^ゞ