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, (^^ゞ