XSS(クロスサイトスクリプティング)完全攻略|攻撃種別・エスケープ処理とCSP徹底解説
情報処理技術者試験(基本情報・応用情報・支援士)のWebセキュリティ分野において、SQLインジェクションと並び出題頻度トップを争う超重要テーマが「XSS(クロスサイトスクリプティング / Cross-Site Scripting)」です。
「悪意あるJavaScriptが利用者のブラウザ上で実行される」という基本原理に加え、試験では「反射型」「格納型」「DOM-based」の違いや、コンテキストに応じた適切なエスケープ処理、CSP(Content Security Policy)の設計、Cookie保護策(HttpOnly属性)との多層防御が深く問われます。
本記事では、XSSの攻撃成立メカニズムから、IPA試験で頻出の攻撃パターン、根本的対策と保険的対策の明確な区別、午後記述式試験で満点を獲得するための記述テンプレートまでを体系的に解説します。
1. XSSとは? 攻撃成立のメカニズムと3大分類
XSSとは、Webアプリケーションの出力処理やDOM操作の不備を突いて、攻撃者が罠を仕掛け、訪問者のブラウザ上で悪意あるスクリプト(主にJavaScript)を実行させる攻撃です。
スクリプトが実行されると、Cookie情報(セッションID)の盗聴によるセッションハイジャック、偽のログインフォーム表示による認証情報の窃取(フィッシング)、ユーザーの権限での不正なリクエスト送信(画面改ざんや送金等)など、極めて深刻な被害が発生します。
分類 | 攻撃の成立経路 | 特徴とIPA試験での論点 |
|---|---|---|
① 反射型 XSS (Reflected XSS) | 攻撃者が細工したリンク(URLパラメータ等)を踏ませ、サーバの応答ページに入力値がそのままスクリプトとして反射・実行される。 | メールやSNSの罠リンクから誘導される。入力値がサーバを一度経由してHTML内に展開される。 |
② 格納型 XSS (Stored / Persistent XSS) | 攻撃者が掲示板やプロフィール等にスクリプトを投稿してDBに保存させ、閲覧した不特定多数の利用者のブラウザで自動実行される。 | 被害範囲が最も広く深刻。DBに悪意あるデータが蓄積されるため、リンクを踏ませる必要がない。 |
③ DOM-based XSS | サーバ側の応答HTMLには問題がないが、ブラウザ上のJavaScript(DOM操作)が危険な入力値(location.hash等)を不安全に評価・出力して発火する。 | サーバ側のHTMLエスケープだけでは防御できない。DOMのシンク(innerHTMLやeval等)の安全な実装が必要。 |
2. IPA試験で頻出の攻撃手法と出題パターン
午前問題や午後記述試験では、以下の具体的なシチュエーションに応じた脆弱性の指摘・原因分析が出題されます。
- HTML要素の出力文脈: <div> や <p> などの要素テキストとして出力される場合。 <script> タグだけでなく、 <img> や <svg> の onload / onerror イベントハンドラを用いた攻撃手法が頻出。
- HTML属性値の出力文脈: <input value="..."> や <a href="..."> など属性値に出力される場合。属性値をクォート(" や ')で囲んでいないと、空白や > で属性・タグを抜け出されてスクリプトを実行される。
- JavaScript内の出力文脈: <script> var name = '...'; </script> のようにスクリプトブロック内で出力される場合。HTML実体参照化(エスケープ)を行うとJS構文エラーになるため、UnicodeエスケープやJSONシリアライズが必要。
- javascript: スキームへのリンク: <a href="【入力値】"> のリンク先URLに javascript:alert(1) を指定される攻撃。スキーム(http/https)のホワイトリスト検証が必要。
3. 防御対策の鉄則:根本的対策 vs 保険的対策
IPA試験(特に支援士・応用情報の午後試験)では、「XSSの発生自体を防ぐ根本的対策」と「スクリプトが動いた場合でも被害を局所化する保険的対策」を厳密に区別して解答する必要があります。
分類 | 対策手法 | 役割・効果 | 試験での位置づけ |
|---|---|---|---|
根本的対策 ① | HTML特殊文字のエスケープ処理 | 「&, <, >, ", '」の5大文字をHTML実体参照(&, <, >, ", ')に変換する。 | 【最優先の正解】 HTML本文に出力する際の第1必須対策。 |
根本的対策 ② | 属性値の必ずダブルクォート囲み | 属性値を出力する際、必ず "..." で囲み、内部の " をエスケープする。 | 属性値コンテキストでの必須実装。クォート省略による属性脱出を防ぐ。 |
根本的対策 ③ | URLのスキーム検証 | リンク先URL(href/src)を http:// または https:// のみに制限する。 | javascript: スキームによるXSSの根本対策。 |
根本的対策 ④ | 安全なDOM APIの使用 | innerHTML や document.write ではなく textContent や innerText を使用する。 | DOM-based XSSに対する根本的対策。 |
保険的対策 ① | CSP (Content Security Policy) | HTTPヘッダ(Content-Security-Policy)でインラインスクリプトの実行や外部接続先を厳格に制限する。 | XSSが発火してもスクリプト実行やデータ送信をブラウザ側で遮断する強力な多層防御。 |
保険的対策 ② | Cookieへの HttpOnly 属性付与 | JavaScript(document.cookie)からのセッションID読み取りをブラウザで禁止する。 | XSSによるセッションハイジャック被害を直接防止する代表的な保険的対策。 |
保険的対策 ③ | WAF (Web Application Firewall) | シグネチャに基づき、<script>等の攻撃パターンを含む通信を遮断する。 | アプリ改修までの応急措置・多層防御。 |
4. 午後記述式試験(SC・AP)で使える得点キーワード・記述テンプレート
午後試験の記述問題でXSS対策や原因を問われた場合、文字数制限(20字〜40字)の中で過不足なく得点キーワードを盛り込みましょう。
【定番記述フレーズ①(HTML出力対策)】 「HTMLの特殊文字(&, <, >, ", ')を実体参照にエスケープ処理する。」(39字)
【定番記述フレーズ②(属性値対策)】 「属性値をダブル引用符で囲み、属性値内の特殊文字をエスケープする。」(34字)
【定番記述フレーズ③(URLスキーム対策)】 「リンク先URLのスキームがhttp又はhttpsであることを検証する。」(34字)
【定番記述フレーズ④(セッション保護の保険的対策)】 「セッションCookieにHttpOnly属性を設定してJavaScriptからの参照を禁止する。」(44字)
【定番記述フレーズ⑤(CSPによる多層防御)】 「CSPヘッダを設定し、インラインスクリプトの実行を無効化する。」(32字)