Hello there, ('ω')ノ
記事:
ねらい
今回のケースは、ログインページで発見されたOpen Redirect(任意のURLへリダイレクトできる脆弱性)を起点に、それを利用してXSS(クロスサイトスクリプティング)へと発展させた事例です。 攻撃者はまず、ログイン後のリダイレクト先を制御できることを確認し、その値がHTML属性やスクリプトに埋め込まれることに気づきます。そこからJavaScript実行を仕掛ける流れです。
全体像(ストーリー)
- ログインURLにnext=任意URLのようなパラメータが存在することを確認。
- 本来は自社ドメイン内のページに遷移すべきだが、外部ドメインも指定できてしまう → Open Redirect。
- 次に、その値がHTMLの一部として埋め込まれていることを確認。
- 単なるリダイレクトではなく、悪性スクリプトを仕込めると判明。
- ペイロードを設計して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="...">の 属性値コンテキスト。 脱出手順は:
"で属性を閉じる>でタグを閉じる- 任意の悪性要素を挿入する(例:
<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, (^^ゞ