Shikata Ga Nai

Private? There is no such things.

LAB: パスワードリセットのロジック不備によるアカウント乗っ取り

Hello there, ('ω')ノ

🎯 ラボの目的

  • 自分(wiener)のパスワードリセット機能を使って動作を観察。
  • トークンなしでもパスワードが変更できることを確認。
  • それを応用し、carlos のパスワードを任意に変更。
  • 変更後、carlos でログイン → 「My account」ページにアクセス → 🎉 ラボクリア!

🔐 初期情報

  • 自分のアカウント:
  ユーザー名: wiener
  パスワード: peter
  • 乗っ取り対象:
  ユーザー名: carlos

🧪 攻略手順(Burp Suite使用)

1. 自分のパスワードをリセット

  • Forgot your password?」をクリックし、ユーザー名 wiener を入力。
  • Email client」でメールを確認し、リセットリンクをクリック。
  • 任意の新しいパスワードに変更。

2. Burpでリクエストを分析

  • Burpの Proxy > HTTP history を開く。
  • POST /forgot-password?temp-forgot-password-token=... を確認。
  • ボディ内にも以下のような内容があるはず:
  username=wiener
  new-password-1=abc12345
  new-password-2=abc12345

3. Repeaterでテスト

  • 上記リクエストを Repeater に送り、次のように変更して送信:

    • URLのtemp-forgot-password-tokenパラメータ:空にする
    • ボディのtemp-forgot-password-token削除するか空に
    • usernamecarlos に変更
    • パスワード:任意(例:testpass123

4. carlos でログインして確認

  • ブラウザに戻ってログアウト。
  • ユーザー名 carlos / パスワード testpass123 でログイン。
  • My account」をクリック → 🎉 ラボクリア!

🔍 脆弱性の正体

問題点 解説
トークンのチェックがない リセット時にトークンを検証していないため、誰でも誰のパスワードでも変更可能
usernameがフォームで指定可能 任意のユーザーに変更して送信できてしまう
URLとボディのトークンの存在が無意味 セキュリティ設計が形骸化している

🛡 防御策(開発者向け)

  • パスワードリセットフォームでは、トークンをサーバー側で必ず検証
  • トークンとユーザーIDをサーバーで紐づけ、外部からの改ざんを無効化
  • トークンは一度のみ有効で短時間で失効すべき。

🔐 パスワードリセットは「セキュリティの抜け道」になりやすい機能です。トークンが付いていれば安全と思い込まず、そのトークンが実際に検証されているかを確実にテストしましょう!

Best regards, (^^ゞ