Shikata Ga Nai

Private? There is no such things.

DOMベースの脆弱性診断マニュアル(DOM-based Vulnerabilities)

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テスト手順

  1. ページのJavaScriptを調べる

    • DevTools → Sources タブや Ctrl+FinnerHTML, document.write, location を検索
  2. URLに入力を追加して挙動を観察:

    • ?input=<script>alert(1)</script>
    • #<img src=x onerror=alert(1)>
  3. ページ表示後、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, (^^ゞ