素人がプログラミングを勉強していたブログ

プログラミング、セキュリティ、英語、Webなどのブログ since 2008

連絡先: twitter: @javascripter にどうぞ。

オープンリダイレクタ脆弱性に気をつける

たまたま通販サイトを見ていたらログインページに脆弱性を発見したので、書いておく。

下記サイトのサポート部門から、システム部門に問い合わせて早急に調査するとの連絡があった。

16 June 2014: 脆弱性を確認したので今日か明日中に修正し修正が終わったら連絡するとのメールが来た。

18 June 2014: システム改修が終了したとのメールがあった。

報告済みであるがまだ修正されていないので、ドメインは仮にwww.******.jpとしておく。

https://www.7netshopping.jp/esi.svl?start&CID=ESI997&r_url=http://www.7netshopping.jp.example.com

のように、ドメインのバリデーションを先頭一致で行っていたため、末尾に.example.comなどとつけると、ログイン成功時にユーザを任意のドメインのサイトに飛ばすことが可能になっていた。これは一見大きな問題ではないように思えるが、危険な脆弱性である。

何が問題なのか

ウェブサイトのログインページは、元のページに戻るために、

&redirect_url=http://example.com/

のようなパラメータが指定してあることが多い。例えばjavascript:alert(1)が通るようであれば危険であることはなんとなくわかるが、http/httpsのURLであっても、管理下(同一のドメインなど)にない、任意のURLを指定できると、危険である。

具体的な攻撃シナリオは、下記の通り。

http://example.com/login?redirect=http://evil.example.jp

というページにアクセスする場合を考える。 ユーザは正しいドメインのサイトにアクセスすることになるので、何も警戒せずにIDやパスワードを入力する。 しかし、ログインに成功した後、オープンリダイレクタ脆弱性によって、悪意のあるevil.example.jpに飛ばされてしまう。このページは、本物のログインページの、ログイン失敗時そっくりに作られており、「ログインに失敗しました。IDとパスワードを再入力してください」と書いてあり、ユーザが気づかずにIDとパスワードを入力してしまうと、それが盗まれてしまう。

最近のウェブブラウザは、ドメインのみを表示するUIに以降しつつあり、セキュリティに詳しい人であっても、最初のログイン時に、リダイレクト先が細工されていることに気づくことは困難である。

リダイレクト機能を実装する場合、http://やhttps://など、プロトコルを限定することは必須であるが、ドメイン名も末尾一致で検索すべきである。特に、URL全体に対して正規表現などで検索をするとバリデーション漏れになりやすいので、なるべくならURLパーサを使い、ドメイン部ごとなどに、きちんとすべて検証すべきである。

参考: