認証・認可の脆弱性:ログインとIDOR
ログイン処理の流れ
この回でやること
ログインボタンを押してから画面が切り替わるまでに、サーバーの中で何が4段階で起きているか。どの段にどんな穴が空くのかの地図になります。
- 読む 約 7 分
- 最後にクイズ 1 問
このレッスンで学ぶこと
ログインは、ボタンを押してから画面が切り替わるまでに、サーバーの中で4つのことが順に起きる処理です。この回はその4段を分けて見られるようにし、章全体の地図にします。
読み終えるころには、自分のサービスのログインを4つの段に切り分けて、それぞれで何が起きているかを言えるようになります。
4つの段
練習用のショップでtanakaとしてログインするとき、サーバーは次の順で動きます。
- 入力を受け取る。利用者名とパスワードがリクエストの本文で届きます
- 利用者を探す。
tanakaという名前の行がデータベースにあるかを引きます - パスワードを照合する。保存してあるハッシュと、届いたパスワードを突き合わせます
- セッションを配る。合っていれば合言葉を1つ発行し、Cookieに入れて返します
プレーンテキスト
POST /login name=tanaka password=tanaka-pass
→ 2 users テーブルから tanaka の行を引く
→ 3 password_hash と照合する
→ 4 Set-Cookie: session=9f2c...段ごとに、空く穴が違う
大事なのは、この4つがそれぞれ別の失敗のしかたを持つことです。
2の段では、見つかったかどうかが応答に出てしまうことがあります。存在しない名前だと「そのIDはありません」、存在する名前だと「パスワードが違います」と返る作りだと、パスワードを1つも知らないまま登録済みのIDを集められます。次回扱う列挙です。
3の段では、照合そのものは正しくても、何度でも試せることが問題になります。回数の制限が無ければ、時間さえかければ通ります。
4の段では、ログイン前に配った合言葉をそのまま使い回すと、他人が先に用意した合言葉で入られてしまいます。
「ログインを強くする」という言い方では、何を直すのか決まりません。存在の漏れは2、試行の回数は3、合言葉の扱いは4。段を分けてはじめて、対策も分かれます。
手を動かす
練習用の環境で、正しいパスワードと間違ったパスワードの両方を送り、返る本文とステータスコードを並べて記録してください。次回からは、この記録が「普通の反応」の基準になります。