オープンリダイレクトとは

Webアプリケーションでは、ユーザーを特定のページに自動で遷移させる「リダイレクト」処理がよく使われます。たとえば、ログイン後にマイページへ遷移させたり、古いURLから新しいURLへ案内したりする場面です。

この際、リダイレクト先のURLをクエリパラメータとして外部から受け取る仕組みがあると、注意が必要です。たとえば以下のようなコードです:

1
2
const redirectTo = req.query.redirect;
res.redirect(redirectTo);

このような実装では、以下のようなURLがそのまま処理されてしまいます。

https://example.com/login?redirect=https://attacker.com

この脆弱性をオープンリダイレクトと呼びます。外部から指定されたURLに無条件でリダイレクトしてしまうことで、悪意あるサイトへユーザーを誘導する危険性があります。

なぜ危険なのか

信頼されたドメインを悪用できる

ユーザーは「example.com」のような信頼されたドメインがURLに含まれていると、それを信用してしまいがちです。攻撃者はこの特性を悪用し、以下のようなURLを作成します。

https://trusted-site.com/login?redirect=https://phishing.com

見た目では trusted-site.com にアクセスするように見えるため、ユーザーは警戒心を持たずにクリックしてしまう恐れがあります。

フィッシング詐欺に直結する

リダイレクト先には、本物そっくりの偽ログインページが用意されていることが多く、ユーザーがIDやパスワードを入力してしまえば、簡単に情報を盗まれてしまいます。

他の脆弱性と組み合わせた攻撃が可能

オープンリダイレクトは単独でも危険ですが、以下のような攻撃と組み合わせることで、さらに深刻な被害につながります。

  • XSSでクッキーを盗んだあとに、リダイレクトで偽サイトへ誘導
  • CSRFで不正な操作をさせた後、完了画面を偽装したページへ遷移
  • OAuthのリダイレクトURIに悪意あるURLを指定して認可コードを窃取

実際の攻撃例

例1:メールでの誘導

https://secure-shop.com/login?redirect=https://fake-login.shop

このようなURLを「不正アクセス検出」などの文言とともにメールで送信すると、ユーザーは正規サイトだと誤認し、クリックしてしまいます。

例2:検索エンジン経由での拡散

一部の大手検索エンジンやSNSでは、リダイレクト付きURLを広告リンクなどに使っていたケースがあり、その仕組みを悪用して不正なリダイレクトが拡散された事例も報告されています。

脆弱性の確認方法

URLを直接入力して検証する

リダイレクト処理を含むエンドポイント(例:/login?redirect=)に対して、外部ドメインを指定してアクセスし、リダイレクトされるかを確認します。

https://example.com/login?redirect=https://attacker.com

このようなアクセスで外部ドメインに遷移すれば、オープンリダイレクトの可能性が高いです。

セキュリティツールを使った検出

以下のようなツールを用いることで、自動的にリダイレクト挙動を検出できます。

  • Burp Suite:プロキシ経由でリクエストを操作し、リダイレクトの有無を確認可能
  • OWASP ZAP:既知のパターンに基づいてリダイレクト脆弱性をスキャン

対策方法

ホワイトリスト方式を導入する

あらかじめ安全なリダイレクト先を定義し、それ以外のURLを拒否する方法です。たとえば以下のように実装します。

1
2
3
ALLOWED_PATHS = ["/dashboard", "/settings"]
if redirect_path not in ALLOWED_PATHS:
    redirect_path = "/home"

外部ドメインを排除し、相対パスのみ許可する

フルURLの指定(例:https://example.com)ではなく、アプリ内の相対パス(例:/profile)のみを受け入れるようにします。

1
2
3
4
5
const redirectTo = req.query.redirect;
if (!redirectTo.startsWith("/")) {
  redirectTo = "/home";
}
res.redirect(redirectTo);

警告画面を挟む

外部ドメインへのリダイレクト時に、以下のような確認画面を表示することで、ユーザーの誤クリックを防げます。

外部サイト(https://external.com)に遷移しようとしています。
このサイトは当社の管理下にありません。移動しますか?
[移動する] [キャンセル]

まとめ

オープンリダイレクトは一見単純なリダイレクト処理に潜む重大な脆弱性です。信頼されたドメインを悪用できるという特性から、フィッシング詐欺や情報漏洩の原因になりやすく、被害は深刻化しがちです。

リダイレクト処理を含む実装では、ユーザー入力の検証と制限を徹底し、安全なWebアプリケーションを設計・運用することが求められます。