認証・認可の脆弱性:ログインとIDOR
セッションの更新とログアウト
この回でやること
ログイン処理の「セッションを配る」段の回収です。ログイン前の合言葉を使い回すセッション固定、Cookieを消すだけのログアウト、変更後も残る他端末のセッションを直します。
- 読む 約 7 分
- 最後にクイズ 1 問
このレッスンで学ぶこと
セッションの更新とログアウトは、ログインの4段の最後、合言葉を配る段の話です。合言葉をいつ作り直し、いつ捨てるかを間違えると、パスワードが正しくても他人に入られます。
読み終えると、セッション固定、ログアウト、パスワード変更の3つの場面を、練習用のショップで順に確かめられるようになります。
ログイン前の合言葉を配り直さない
1本目で、配る段に穴が空くと言いました。その具体がセッション固定です。多くのサイトは、ログインする前から合言葉を1つ配っています。カートの中身などを覚えるためです。ログインが成功したときにこの合言葉を新しいものへ発行し直さないと、攻撃者が自分の合言葉を被害者のブラウザに仕込み、被害者がその状態でログインすると、ログイン後も攻撃者の手元の合言葉が本人として通ります。
直し方は1つです。ログインが成功した瞬間に、必ず新しい合言葉を発行し直し、前のものを捨てます。 ログインの前後で合言葉が変わっていれば、事前に仕込まれたものは無効になります。
ログアウトがCookieを消すだけ
ログアウトも同じ段の話です。ボタンを押したとき、ブラウザのCookieを消すだけで済ませていると、サーバ側では合言葉がまだ有効なままです。通信を控えていた相手が、その合言葉をもう一度送れば入れます。
プレーンテキスト
(ログアウト後に古い合言葉を付けて送る)
GET /api/orders/1043 Cookie: session=古い合言葉
→ 401 が返れば、サーバ側で破棄できている
→ 200 が返れば、消えたのは画面の Cookie だけDevToolsのNetworkで、ログアウトのあとに古い合言葉を付けたリクエストを送り、どちらが返るかを確かめられます。ログアウトは、サーバ側の合言葉を破棄して初めて完了します。
パスワードを変えても他端末が残る
パスワードを変えたときも、合言葉を配り直します。前回の再設定でも触れたとおり、変更の目的の1つは、盗まれて入り込んでいる相手を追い出すことです。ところが変更しても相手の合言葉を無効にしなければ、別の端末で開いたままのセッションは生き残ります。認証情報が変わったら、本人が今使っている1本を除いて、そのアカウントの合言葉を全部捨てます。
セッション固定もログアウトも、鍵は「いつ合言葉を作り直し、いつ捨てるか」にあります。ログイン成功で作り直し、ログアウトと認証情報の変更で捨てる。画面のCookieを操作するだけでは、サーバ側の合言葉は動きません。