Shikata Ga Nai

Private? There is no such things.

【有料試作版】BugBounty解説:Open RedirectからXSSへの発展(ログインページ)

Hello there, ('ω')ノ

記事:

https://nassimchami.medium.com/1st-bug-bounty-writeup-open-redirect-to-xss-on-login-page-313221da2879


ねらい

今回のケースは、ログインページで発見されたOpen Redirect(任意のURLへリダイレクトできる脆弱性)を起点に、それを利用してXSS(クロスサイトスクリプティング)へと発展させた事例です。 攻撃者はまず、ログイン後のリダイレクト先を制御できることを確認し、その値がHTML属性やスクリプトに埋め込まれることに気づきます。そこからJavaScript実行を仕掛ける流れです。


全体像(ストーリー)

  1. ログインURLにnext=任意URLのようなパラメータが存在することを確認。
  2. 本来は自社ドメイン内のページに遷移すべきだが、外部ドメインも指定できてしまう → Open Redirect
  3. 次に、その値がHTMLの一部として埋め込まれていることを確認。
  4. 単なるリダイレクトではなく、悪性スクリプトを仕込めると判明。
  5. ペイロードを設計してXSS(alert(1))を実行。

実践:一手ずつ「なぜそうするか」

1) 入力点を探す

  • 操作:ログインページのURLに ?next=https://example.com を付与。
  • 観察:ログイン後、自動でexample.comにリダイレクトされた。
  • なぜ:開発者は「ログイン後に元のページへ戻す」仕組みを作っており、そのパラメータが未検証で外部URLも許可されている。

2) 出力場所を探す

  • 状況:パラメータ next の値が、HTML内に埋め込まれている。 例:
  <form action="/login?next=https://example.com">
  • なぜ:ユーザーに「ログイン後に戻る先」を見せるために、HTMLに直接出力している。
  • これにより、HTML属性コンテキストでのXSSの可能性が生まれる。

3) 攻撃コンテキストを理解する

  • 今いるのは <form action="...">属性値コンテキスト
  • 脱出手順は:

    1. " で属性を閉じる
    2. > でタグを閉じる
    3. 任意の悪性要素を挿入する(例:<script>alert(1)</script>

4) ペイロード設計

  • 人間可読な形:
  next="><script>alert(1)</script>
  • なぜ:

    • 最初の " で属性値を終了
    • > でタグを閉じる
    • <script> を差し込み、alertを実行

5) URLエンコードして実行

  • ブラウザに貼れる形に変換する:
  /login?next=%22%3E%3Cscript%3Ealert(1)%3C/script%3E
  • なぜ:クエリ文字列に直接 < > " = を入れると壊れるため、必ずエンコードする。

6) 実行確認

  • 操作:上記URLでログインページを開く。
  • 観察:ページ読込時にalert(1)が発火。
  • 理由:next の値がHTMLとして解釈され、scriptタグが実行された。

ペイロードまとめ

  • エンコード済み(そのまま使える):
/login?next=%22%3E%3Cscript%3Ealert(1)%3C/script%3E
  • 人間可読(ブラウザ貼る前にエンコード必要):
next="><script>alert(1)</script>

実務目線の防御策

  • リダイレクト先をホワイトリスト化 自社ドメイン以外を許可しない。

  • HTML出力時にエスケープ パラメータをそのままHTML属性値に入れない。

  • CSP適用 script-src を適切に設定し、インラインスクリプト実行を禁止。


まとめ

今回の攻撃のポイントは、 「Open Redirect」という一見軽微な脆弱性が、 「XSS」という深刻な脆弱性に発展した、ということです。

考え方の流れは:

  • 入力点を見つける(nextパラメータ)
  • 出力される場所を確認する(HTML属性)
  • 文脈を理解し、脱出シーケンスを設計する
  • エンコードしたペイロードを実行する

この「入力 → 出力 → コンテキスト → 脱出」という思考パターンは、他のXSS探索でも応用できます。

Best regards, (^^ゞ