Hello there, ('ω')ノ
🔍 背景
モダンなWebアプリケーションは、多くの場合、jQueryや他のJavaScriptフレームワークを使って構築されています。こうしたライブラリの中にも、DOM XSS(クロスサイトスクリプティング)を引き起こす「シンク(sink)」が存在します。
💥 DOM XSSの仕組み(jQuery版)
以下のようなコードがあると仮定します:
$(function() { $('#backLink').attr("href",(new URLSearchParams(window.location.search)).get('returnUrl')); });
このコードでは、URLのクエリパラメータ(例:?returnUrl=...
)から値を取り出し、#backLink
というIDのリンクのhref
属性に代入しています。
🧪 攻撃例
攻撃者は、次のようなリンクを犠牲者にクリックさせます:
https://vulnerable-website.com/page?returnUrl=javascript:alert(document.domain)
このURLにアクセスすると:
returnUrl
の値javascript:alert(document.domain)
がhref
にそのまま設定されます。- ユーザーが
#backLink
をクリックすると、JavaScriptが実行されます。
✅ ポイント
attr("href", userInput)
のようなコードにユーザー入力をそのまま渡すのは非常に危険です。- 特に javascript:* プロトコルを使ったURLは、任意のJavaScript実行を可能にします。
- jQueryなどの便利な関数もXSSの温床になり得るので注意が必要です。
🛡️ 対策
- ユーザー入力を使って属性値を設定する場合は、ホワイトリストでバリデーションを行いましょう。
javascript:
のようなプロトコルを検出してブロックすることが重要です。- jQueryのような便利なライブラリでも、開発者が責任を持って使い方を制御する必要があります。
Best regards, (^^ゞ