Shikata Ga Nai

Private? There is no such things.

DOMベースのクロスサイトスクリプティング(DOM-based XSS)とは?

Hello there, ('ω')ノ

💡 DOM-based XSSの概要

DOM-based XSS(ドムベースクロスサイトスクリプティング)は、クライアントサイドのJavaScriptによって発生するXSS脆弱性です。サーバーではなく、ブラウザ上のJavaScriptコードが攻撃ベクトルになります。


🧪 発生の仕組み

  1. JavaScriptが、URLなどの攻撃者が制御可能なソース(source)から値を取得。
  2. その値が、innerHTMLeval() などの危険なシンク(sink)へ渡される。
  3. その結果、任意のJavaScriptコードが実行されてしまう。

📌 例:典型的なDOM XSSパターン

var search = window.location.hash.substring(1);
document.getElementById('result').innerHTML = search;

上記のコードは、URLのハッシュ部分(#以降)をそのままHTMLに挿入してしまう例です。

攻撃者が次のようなURLを被害者に送ると:

https://vulnerable-site.com/#<img src=x onerror=alert(1)>

ページが読み込まれた瞬間に、alert(1) が実行されます。


🔍 よく使われるソース(source)

  • window.location(URL)
  • document.URL
  • document.location.hash
  • document.referrer

⚠️ よく使われるシンク(sink)

  • innerHTML
  • outerHTML
  • document.write()
  • eval()
  • setTimeout()setInterval()(文字列を受け取るとき)
  • location.href = ...(自己遷移型のXSS)

🧠 対策

  • innerText / textContent を使ってHTMLエスケープされた出力に変更する。
  • DOMPurifyなどのクライアントサイドサニタイザを使用。
  • eval()innerHTML の使用を避ける。
  • 外部からの入力は必ず検証・エスケープする。

📘 まとめ

項目 内容
タイプ クライアントサイドXSS
主要原因 JavaScriptの不適切なDOM操作
攻撃ベクトル URLのパラメータやハッシュなど
対策 安全なDOM APIの使用、入力のサニタイズ

DOM-based XSSはサーバーレスポンスに現れないため、Burpなどの通常の検査では見逃されやすいです。開発段階やテスト段階で、JavaScriptコードの静的解析ブラウザ上での挙動確認が非常に重要になります。

Best regards, (^^ゞ