Hello there, ('ω')ノ
💡 DOM-based XSSの概要
DOM-based XSS(ドムベースクロスサイトスクリプティング)は、クライアントサイドのJavaScriptによって発生するXSS脆弱性です。サーバーではなく、ブラウザ上のJavaScriptコードが攻撃ベクトルになります。
🧪 発生の仕組み
- JavaScriptが、URLなどの攻撃者が制御可能なソース(source)から値を取得。
- その値が、
innerHTML
やeval()
などの危険なシンク(sink)へ渡される。 - その結果、任意の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, (^^ゞ