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.URLdocument.location.hashdocument.referrer
⚠️ よく使われるシンク(sink)
innerHTMLouterHTMLdocument.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, (^^ゞ