Hello there, ('ω')ノ
🎯 1. DOMベース脆弱性とは?
DOM-based 脆弱性は、WebページのJavaScriptがクライアントサイド(ブラウザ)で動的に生成したHTMLや挙動に、 ユーザ入力が不適切に反映されることによって発生する脆弱性です。
代表的なもの:DOM-based XSS、オープンリダイレクト、情報漏洩など
🧠 違いのイメージ
| 種類 | 説明 | データ流れ |
|---|---|---|
| 通常のXSS | サーバがHTML内にスクリプトを出力 | リクエスト → サーバ → レスポンス |
| DOM-based XSS | JavaScriptがクライアント側でHTMLを変更 | リクエスト → JS → DOM変更(サーバ関係なし) |
🧭 2. DOMベースで起きやすい脆弱性の種類
| 種類 | 具体例 | 脆弱性内容 |
|---|---|---|
| 🧨 DOM-based XSS | innerHTML, document.write, eval など |
スクリプト実行 |
| 🔁 オープンリダイレクト | location.href = location.search など |
他サイトへの強制移動 |
| 📤 情報漏洩 | URLフラグメントをそのまま表示 | クレデンシャルやトークンが漏れる |
🔍 3. チェックすべきJavaScriptコード
直接使われると危険なAPI:
| API名 | 内容 |
|---|---|
document.write() |
生のHTML挿入 |
element.innerHTML |
スクリプトも挿入できてしまう |
eval(), setTimeout(string) |
任意コード実行 |
location.href, location.hash, document.URL |
ユーザ入力由来であれば危険源 |
window.name |
他ページからも値を渡せてしまう場合あり |
🧪 4. 基本的なDOM XSSテスト手順
ページのJavaScriptを調べる
- DevTools →
SourcesタブやCtrl+FでinnerHTML,document.write,locationを検索
- DevTools →
URLに入力を追加して挙動を観察:
?input=<script>alert(1)</script>#<img src=x onerror=alert(1)>
- ページ表示後、JavaScriptがその値をDOMに挿入しているかを確認
🧪 5. テスト用ペイロード例
URLパラメータを利用している場合
https://example.com/page.html?name=<img src=x onerror=alert(1)>
// 脆弱なコード例
const name = new URLSearchParams(location.search).get("name");
document.getElementById("username").innerHTML = name;
→ ページ内に alert が出たら脆弱
フラグメント(#)を使った例
https://example.com/page.html#<script>alert(1)</script>
document.body.innerHTML = location.hash;
→ <script> が実行される
🔁 6. DOMベースのオープンリダイレクト診断
const dest = new URLSearchParams(location.search).get("next");
location.href = dest;
→ ?next=https://evil.com を指定すると自動リダイレクト → ❌
🔐 7. 防御が適切か確認するポイント
| 対策 | チェック内容 |
|---|---|
| サニタイズ処理あり | innerText, textContent を使っている |
| 属性に入れるときはエンコードされている | 例:setAttribute("src", user_input) で適切に検証 |
JavaScriptでDOMを作る場合は createElement を使用 |
テキストノードは明示的に生成すること |
🧰 8. 補助ツール
- Burp Suite(DOM Invader) → 動的JavaScriptの挙動とDOMベースXSSを自動で検出
- DevTools(Sourcesタブ)
→ スクリプトの挙動をトレース、
location等の使用箇所を検索 - XSS Hunter → DOMベースのXSSがあるとOOBで通知を受け取れる
📌 見つけやすいキーワード・ヒント
| キーワード | 備考 |
|---|---|
innerHTML, document.write, eval |
高リスク操作 |
location.search, location.hash |
ユーザ制御可能な値 |
input, textarea, a.href, img.src に代入 |
出力先に注意 |
| URLに含まれる値がページに即反映されている | 脆弱性の兆候あり |
✅ DOMベース脆弱性診断まとめ
| チェック項目 | 問題の有無 |
|---|---|
| 入力が直接HTMLに挿入されている | ❌ 要注意 |
| JavaScriptで動的にリダイレクトされる | ❌ 要確認 |
| テキストとして処理されている | ✅ 比較的安全 |
| そもそもJSで値を使っていない | ✅ 問題なし |
Best regards, (^^ゞ