Hello there, ('ω')ノ
🔍 状況の背景
多くのDOMベースXSSでは、innerHTMLシンクを通してHTMLにJavaScriptを埋め込もうとします。しかし、モダンブラウザでは次の制限があるため、従来のXSS手法が通用しません:
<script>タグはinnerHTMLに書いても実行されない。<svg onload=...>のようなSVG内のイベントは発火しない。
🧠 重要な回避ポイント
その代わりに、ブラウザが許可している画像やiframe要素を活用し、イベントハンドラ(onerrorやonload)を使ってJavaScriptを発火させます。
✅ 有効なXSSペイロードの例
以下は、innerHTMLに挿入されても動作する攻撃例です:
<img src=1 onerror=alert(document.domain)>
このようなコードがJavaScriptで使われている場合:
element.innerHTML = '<img src=1 onerror=alert(document.domain)>';
上記ペイロードは画像の読み込みに失敗するため、onerrorイベントが発火し、alertが表示されます。
🎯 応用例:iframeでも可能
<iframe src="javascript:alert(document.domain)"></iframe>
ただし、iframeによるjavascript: URIは一部ブラウザで制限があるため、img onerrorのほうがより確実に動作します。
🔒 対策方法
innerHTMLをユーザー入力に対して使わない。- 必要な場合でも、HTMLエスケープ処理を徹底する。
- 代わりに
textContentやcreateElementでDOMを安全に構築する。
Best regards, (^^ゞ