年末年始でセキュリティ分野を学習し、年明けにウェブ・セキュリティ基礎試験(通称:徳丸基礎試験)を受験することにしました。
そこで勉強した内容を備忘録として残します。
今回はオープンリダイレクトについて、概要や原因・一般的な対策をまとめます。
オープンリダイレクトとは何なのか?
オープンリダイレクトは、攻撃者が用意した偽ページへユーザーをリダイレクトできてしまう脆弱性です。
たとえばあなたがwww.example.com
というサイトを利用していて、その中のリンクがwww.example.com/redirect?url=http://trap.com
と設定されていた場合、リンクをクリックするとhttp://trap.com
という偽ページへ誘導されてしまいます。
遷移先の画面を利用していたWebアプリと似せることで、利用者は偽ページへ誘導されていることに気づかないまま個人情報などを入力させられてしまうのです。
オープンリダイレクトはどこでどうやって発生するのか?
オープンリダイレクトは以下の2つ状況で発生してしまいます。
- 遷移先のURLを外部から指定できる
- 遷移先のドメイン名のチェックに漏れがある
遷移先のURLを外部から指定できる
たとえば、安全な掲示板サイトwww.example.com
にwww.example.com/redirect?url=http://trap-site.com
というリンクが投稿されていた場合、見た目上はwww.example.com
からのリダイレクトですが、実際には攻撃者が作成した悪質なサイトへとリダイレクトされてしまいます。
このケースの場合、URLパラメータ(url=
の部分)に含まれるリダイレクト先にどんなURLでも指定できてしまうことがオープンリダイレクトの原因です。
遷移先のドメインのチェックに漏れがある
また遷移先のドメイン名を確認するロジックが甘いと、任意のURLへリダイレクトされてしまいます。
たとえば安全な掲示板サイトwww.example.com
からのリダイレクト先として指定されたURLが、www.example.com
から始まっているかどうかを確認するロジックがサーバーサイドに実装されていると仮定します。
このとき、URLパラメータにwww.trap-site.com
が渡された場合は上記のロジックによりリダイレクトを防ぐことができます。
しかしパラメータに渡されたURLがwww.example.com.trap-site.com
だった場合、www.example.com
から始まっているためリダイレクトは発生してしまいます。
このように、遷移先ドメインのチェックに漏れがあると、そのチェックを回避されてしまうのです。
オープンリダイレクトはどうやったら防げるのか?
オープンリダイレクトの対策として以下の3つが有効です。
- リダイレクト先のURLを固定すること
- リダイレクト先のURLを直接指定しないこと
- リダイレクト先のドメイン名をチェックすること
1. リダイレクト先のURLを固定すること
そもそもリダイレクト先がいつも同じで良いなら、わざわざURLパラメータに遷移先URLを含める必要はありません。
たとえばログイン後にTOPページへリダイレクトさせると決まっているのであれば、TOPページのURLをパラメータに渡さなくても遷移先を固定させてしまえば良いだけですよね。
2. リダイレクト先のURLを直接指定しない
リダイレクト先を動的に変化させたい場合、リダイレクト先の固定はできません。
何かしらの方法でリダイレクト先のURLを受け渡す必要があります。
その場合は、直接URLを渡すのではなく、識別コードを渡すことが有効です。
たとえば、www.example.com/redirect?code=12345
のように指定し、サーバーサイドでcode=12345
と紐づくリダイレクト先へ遷移させれば良いです。
この方法であれば、識別コードと紐づくURL以外へはリダイレクトできないため、悪質な誘導は防げます。
3. リダイレクト先のURLをチェックすること
識別コードを用意できない場合はリダイレクト先のURLが意図したものであるか、検証が必要です。
正規表現などを用いて、遷移できるURLを制限しなくてはなりません。
たとえばwww.example.com
からのリダイレクトのみ許可し、それ以外は拒否するなどの対応をします。
しかしこれだと、先ほどのwww.example.com.trap-site.com
の例のようにサブドメイン形式で指定された場合などに対応しきれません。
少しでも実装に誤りがあるとその隙を突かれてしまうため、できる限り1, 2の対策を優先すべきです。
まとめ
オープンリダイレクトの概要と対策について理解できました。
コメント