認証・認可の脆弱性:ログインとIDOR
パスワード再設定の弱点
この回でやること
パスワード再設定は、ログイン画面を固めても残る抜け道です。トークンの作り方と有効期限、宛先の決め方、再設定後のセッションに空く穴と直し方を扱います。
- 読む 約 7 分
- 最後にクイズ 1 問
このレッスンで学ぶこと
パスワード再設定は、忘れた利用者にメールでリンクを送り、新しいパスワードを決めさせる流れです。この回はこの流れに空く穴を、トークン、期限、宛先、再設定後のセッションの順に直し方と対で見ます。
読み終えると、再設定のリンクが誰に届き、いつ死に、何回使えるかを、練習用のショップで確かめられるようになります。
再設定の流れ
パスワードを忘れた利用者に、メールで再設定のリンクを送ります。リンクにはトークンが1つ付いていて、それを開くと新しいパスワードを決める画面が出ます。
プレーンテキスト
POST /password/forgot name=tanaka
→ tanaka のメールへ再設定リンクを送る
POST /password/reset token=... new=新しいパスワードトークンそのものの弱さ
このトークンが、次のような作りだと破れます。
- 推測できる。連番や短い数字だと、他人のトークンを当てられます。十分に長い乱数にします
- 期限が無い。何日も前のリンクが生きていると、盗み見られたメールから後日使われます。数十分で切れるようにします
- 使い捨てにしていない。一度使ったトークンが二度目も通ると、履歴に残ったリンクで再び変えられます。使ったら即座に無効にします
宛先を入力から取る
最も見落とされるのが、再設定リンクの宛先です。/password/resetの本文に利用者名やメールを入れさせ、その宛先へリンクを送る作りだと、攻撃者が他人のIDを指定して自分のメールにリンクを取り寄せ、そのまま乗っ取れます。宛先は入力から取らず、サーバ側でトークンからアカウントを引きます。トークンを持っている本人以外に、宛先を選ばせないことです。
ただ送るだけに見えて、「誰に送るか」を入力から決めていると、他人あてのリンクを自分に取り寄せられます。送る前に、そのトークンとアカウントの対応をサーバ側で固定しておくことが要です。
列挙は、この画面にも出る
2本目で見た列挙は、この画面にも現れます。存在しないアドレスに「見つかりません」、存在するアドレスに「送信しました」と返し分けると、登録の有無が漏れます。ここでは、宛先の有無にかかわらず同じ「送信しました」を返します。
再設定が終わったら、古いセッションを切る
再設定が済んだら、そのアカウントの既存のセッションを無効にします。そうしないと、パスワードを盗んで先に入り込んでいた相手が、本人が慌てて再設定しても居座り続けます。セッションを無効にする仕組みそのものは次回扱います。