Hello there, ('ω')ノ
🧠 概要
jQueryはかつて非常に広く利用されていたJavaScriptライブラリであり、その柔軟なセレクター関数$()
はDOM操作に頻繁に使用されていました。しかし、この機能は過去に多くのDOMベースXSS(クロスサイトスクリプティング)脆弱性を生む原因にもなっていました。
特に典型的だったのが、location.hash
(URLの#
以降の部分)をそのまま$()
に渡してスクロール処理などに使う実装です。
🚨 脆弱なコード例
$(window).on('hashchange', function() { var element = $(location.hash); element[0].scrollIntoView(); });
このコードは、ユーザーがURLのハッシュ部分(例:#section2
)を変更すると、それに対応する要素を探して自動スクロールします。
しかしlocation.hash
は完全にユーザーの入力で制御可能なため、悪意ある入力を$()
関数に渡すことでHTML要素やスクリプトの挿入が可能になります。
🧪 攻撃例
以下のようなiframe
を用いて、ユーザーの操作なしでhashchange
イベントを発生させ、XSSを実行させることができます。
<iframe src="https://vulnerable-website.com#" onload="this.src+='<img src=1 onerror=alert(1)>'"> </iframe>
この攻撃の流れは以下のとおりです:
iframe
はまず空のハッシュで脆弱なページを読み込みます(#
だけ)。onload
イベントがトリガーされると、src
に悪意あるHTML(<img onerror=alert(1)>
)を含むハッシュを追加します。hashchange
イベントが発生し、$(location.hash)
が実行されてXSSが成立します。
🧱 jQueryの対応と注意点
近年のjQueryでは、セレクターの入力が#
で始まる場合、HTMLタグとしての解釈を防ぐようにパッチが適用されています。これにより、$(location.hash)
のような直接的な攻撃は難しくなっています。
ただし、次の点に注意が必要です:
location.hash
以外の入力を使って$()
に渡す場合(例えばクエリパラメータ)にはまだ脆弱性が残る可能性があります。- 古いバージョンのjQueryを使用しているアプリケーションは今でもこの脆弱性を抱えていることがあります。
✅ 対策
- 常にjQueryを最新版にアップデートする。
- ユーザー入力を直接DOM操作に使用しない。
- HTML挿入が可能なセレクター(
$()
など)への入力は必ず検証・サニタイズする。 - CSP(Content Security Policy)の導入により、インラインスクリプトの実行を防止する。
🔍 まとめ
このようなDOM XSSのパターンは、特に古いコードベースやレガシーライブラリを利用しているサイトで今なお多く見られます。$()
セレクターとユーザー入力の組み合わせは極めて危険です。
セキュリティテスト時にはhashchange
イベントやiframeを用いた自動トリガーにも注目し、DOMの振る舞いを詳細に観察することが重要です。
Best regards, (^^ゞ