Cross Site Scripting (DOM Based)

概要

  • 脆弱性の名前: Cross Site Scripting (DOM Based)
  • 問題の要点: クライアントサイドのJavaScriptコードが、信頼できないデータソース(URL、Cookieなど)から取得したデータを適切に処理せずにDOMを操作することで発生する。
  • よくある発生シーン: シングルページアプリケーション(SPA)、複雑なクライアントサイド処理を行うWebアプリケーション

背景

従来のXSSはサーバーサイドで生成されたHTMLに悪意のあるスクリプトが埋め込まれることが原因でしたが、DOM Based XSSはクライアントサイドのJavaScriptが実行される際に問題が発生します。
近年、JavaScriptフレームワークやライブラリの利用が増え、クライアントサイドでの動的なコンテンツ生成が一般的になったため、DOM Based XSSのリスクが高まっています。

セキュリティ上のリスク

  • 悪意のあるスクリプトがユーザーのブラウザ上で実行され、Cookieの窃取、セッションハイジャック、偽のフォームへの誘導などが可能になる。
  • ユーザーのブラウザを悪用して、Webサイトの改ざんや不正なコンテンツの表示を行う。
  • 機密情報(個人情報、認証情報など)が漏洩する可能性がある。

対処方法の具体例

JavaScript

誤った設定例

URLから取得したパラメータをエスケープせずにDOMに直接書き込む例:

// 誤った例: エスケープ処理なし
document.getElementById('output').innerHTML = location.hash.substring(1);

正しい設定例

textContentプロパティを使用するか、適切なエスケープ処理を行う:

// 正しい例1: textContentを使用
document.getElementById('output').textContent = location.hash.substring(1);

// 正しい例2: エスケープ処理
function escapeHTML(str) {
    let div = document.createElement('div');
    div.appendChild(document.createTextNode(str));
    return div.innerHTML;
}
document.getElementById('output').innerHTML = escapeHTML(location.hash.substring(1));

PHP

誤った設定例

URLパラメータを適切に検証せずにJavaScriptに渡す例:

<?php
// 誤った例: バリデーションなし
$param = $_GET['param'];
echo "<script>var data = '$param';</script>";
?>

正しい設定例

URLパラメータを検証し、JavaScriptに渡す前にエスケープする:

<?php
// 正しい例: エスケープ処理
$param = htmlspecialchars($_GET['param'], ENT_QUOTES, 'UTF-8');
echo "<script>var data = '$param';</script>";
?>

検出方法

OWASP ZAPでの出力例

  • Alert 名: Cross Site Scripting (DOM Based)
  • リスク: High
  • URL: 問題のあるパラメータを含むURL
  • パラメータ: 悪用可能なパラメータ
  • 詳細: 脆弱性が存在する場所と、悪用方法に関する情報

手動再現例

  1. 問題のあるURLを特定します。
  2. URLに悪意のあるJavaScriptコードを挿入します(例:<script>alert('XSS')</script>)。
  3. ブラウザでURLを開き、スクリプトが実行されるかどうかを確認します。

例:

https://example.com/vulnerable.html#<script>alert('XSS')</script>

まとめ

  • CVSS 基本値: 7.5 (High)
  • 運用チームや開発者が意識すべきポイント:
    • 信頼できないデータソースからの入力を検証し、エスケープする。
    • textContentプロパティを使用するなど、安全なDOM操作を行う。
    • サードパーティのJavaScriptライブラリの脆弱性を定期的にチェックする。
    • CSP(Content Security Policy)を適切に設定し、インラインスクリプトの実行を制限する。
  • 再発防止:
    • 開発プロセス全体でセキュリティを考慮する(Security by Design)。
    • コードレビューを実施し、脆弱性のあるコードを早期に発見する。
    • 自動脆弱性診断ツールを導入し、定期的にスキャンを行う。
    • 開発者向けのセキュリティトレーニングを実施する。

補足資料・参考URL

以上の対策と検出方法を活用して、DOM Based XSSのリスクを低減してください。