Shikata Ga Nai

Private? There is no such things.

第三者ライブラリを利用したDOM XSS:jQueryとattr()による攻撃

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, (^^ゞ