Shikata Ga Nai

Private? There is no such things.

DOMベースXSSで`innerHTML`シンクを使った攻撃方法

Hello there, ('ω')ノ

🔍 状況の背景

多くのDOMベースXSSでは、innerHTMLシンクを通してHTMLにJavaScriptを埋め込もうとします。しかし、モダンブラウザでは次の制限があるため、従来のXSS手法が通用しません:

  • <script>タグはinnerHTMLに書いても実行されない。
  • <svg onload=...> のようなSVG内のイベントは発火しない。

🧠 重要な回避ポイント

その代わりに、ブラウザが許可している画像やiframe要素を活用し、イベントハンドラ(onerroronloadを使って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エスケープ処理を徹底する。
  • 代わりに textContentcreateElement でDOMを安全に構築する。

Best regards, (^^ゞ