My Photo

« 正規表現メモ(2) mfind | Main | 左耳の聴力低下 »

November 24, 2013

オープンリダイレクト脆弱性

発生箇所 外部から指定したURLにリダイレクト可能な箇所
影響を受けるページ Webアプリケーションの特定ページが影響を受けるわけではなく、フィッシング手法により重要情報が盗まれることで利用者が被害を受ける。
影響の種類
  • フィッシングサイトに誘導され重要情報が入力させられる。
  • デバイスドライバやパッチと称してマルウェアを配布される。
利用者の関与の度合い 大(リンクのクリックおよび情報の入力)

概要

Webアプリケーションにおいて、パラメータにより指定したURLにリダイレクトする機能をリダイレクタと呼ぶ。
特に、任意のドメインにリダイレクトできるものをオープンリダイレクタと呼ぶ。
利用者が信頼しているドメイン上にオープンリダイレクタ脆弱性があると、利用者は自分が信頼しているサイトを閲覧しているつもりでも知らない間に罠のサイトに誘導される可能性がある。

攻撃手法

例として、ログイン認証後にGETパラメータurlで指定されたURLにリダイレクトする "https://example.jp/login.php" を考える。攻撃者はメールやブログなどで利用者が以下のURLを閲覧するように仕向ける。

https://example.jp/login.php?url=<罠サイトのURL>

利用者の多くはドメインが本物でありHTTPSの場合も証明書のエラーが表示されないので、安心してIDとパスワードを入力する。
利用者がログインすると罠サイトにリダイレクトされる。罠サイトで
「ログインエラー。IDとパスワードを際入力してください。」
などと表示されると、やはり多くの利用者は入力ミスしたものと思いIDとパスワードを入力してしまう。このようにして重要情報が収集される。

脆弱性の原因

以下の2点をともに満たす場合にオープンリダイレクト脆弱性が存在する。

  • リダイレクト先のURLを外部から指定できる。
  • リダイレクト先のドメインのチェックがない。

オープンリダイレクト脆弱性が差し支えない場合

以下の2点をともに満たす場合、オープンリダイレクタではあるが脆弱性とはならない

  • もともと外部のドメインに遷移する仕様であること。
  • 利用者にとっても外部のドメインに遷移することが自明であること。

この条件を満たす例としてはバナー広告がある。

対策

オープンリダイレクタ脆弱性の対策は以下のいずれかを実施することである。

  • リダイレクト先のURLを固定にする。
  • リダイレクト先のURLを直接指定せず番号指定にする。
  • リダイレクト先のドメインをチェックする。

リダイレクト先のURLのドメインチェックの実装にはミスが起こりやすい。以下に例を挙げる。

失敗例1
if (mb_ereg('example\.jp', $url)) {
	// チェックOK
}

これは
"http://trap.example.com/example.jp.php"
のようにURLの途中に "example.jp" が含まれていればすり抜ける。

失敗例2
if (mb_ereg('^/', $url)) {
	// チェックOK
}

これはURLがスラッシュで始まっていること、すなわちパスの指定のみのURLであることを確認している。
しかし、
"//trap.example.com/trap.php
がすり抜ける。"//" で始まるURLは「ネットワークパス参照」と呼ばれる形式で、ホスト名(FQDN)以下を指定するものであり、外部ドメインへの遷移を防ぐことはできない。

失敗例3
if (mb_ereg('^http://example\.jp/, $url)) {
	// チェックOK
}

これはURLが "http://example.jp" で始まっていることを確認している。これだけではHTTPヘッダインジェクション攻撃に対して脆弱な場合がある。さらにHTTPヘッダインジェクション攻撃で別ドメインにリダイレクトされる場合があるので、この方法ではオープンリダイレクタ脆弱性を防げない可能性がある。

望ましい書き方
if (mb_ereg('\Ahttps?://example\.jp/[-_.!~*\'();\/?:@&=+\$,$#a-zA-Z0-9]*\z', $url)) {
	// チェックOK
}

"http://example.jp/" または "https://example.jp/" で始まること、その後はURIで使用できる文字の身からなることを確認している。文字列の先頭・末尾を示す記号として "\A" と "\z" を使用している。"https?" はhttpとhttpsの両方に対応するためである。

クッションページ

オークションサイトやSNSなど利用者がURLを書き込むとリンクが生成されるサイトでは、その機能がフィッシングサイトに誘導するのに使用される可能性がある。
これを防止する方法として、外部ドメインに対しては直接リンクせず、クッションページと呼ばれるページをはさむ手法がある。クッションページで外部のドメインに遷移することを利用者に告知することによりフィッシングの被害を防止しようという手法である。
外部ドメインへのリダイレクトを許可しているリダイレクタの場合にも、クッションページをはさむことによるフィッシング被害の防止を検討するとよい。
また、携帯電話向けWebアプリケーションの場合は、セッションIDの漏洩防止を目的としてクッションページを使う。

参考文献:体系的に学ぶWebアプリケーションの作り方 4.7.1 オープンリダイレクト脆弱性

体系的に学ぶ 安全なWebアプリケーションの作り方 脆弱性が生まれる原理と対策の実践体系的に学ぶ 安全なWebアプリケーションの作り方 脆弱性が生まれる原理と対策の実践
徳丸 浩

ソフトバンククリエイティブ 2011-03-03
売り上げランキング : 4070

Amazonで詳しく見る
by G-Tools

« 正規表現メモ(2) mfind | Main | 左耳の聴力低下 »

PHP」カテゴリの記事

セキュリティ」カテゴリの記事

Comments

Post a comment

(Not displayed with comment.)

TrackBack

TrackBack URL for this entry:
http://app.cocolog-nifty.com/t/trackback/26461/58637761

Listed below are links to weblogs that reference オープンリダイレクト脆弱性:

« 正規表現メモ(2) mfind | Main | 左耳の聴力低下 »

March 2017
Sun Mon Tue Wed Thu Fri Sat
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
無料ブログはココログ

日本blog村

  • にほんブログ村 IT技術ブログへ
  • にほんブログ村 アニメブログへ
  • にほんブログ村 サッカーブログ アルビレックス新潟へ

好きな音楽家

メモ

XI-Prof