概要
XSS(Cross-Site Scripting)は、攻撃者が悪意のあるスクリプトを正規のWebページに埋め込み、被害者のブラウザ上でスクリプトを実行させる脆弱性です。Cookie の盗取・フィッシング・キーロガーなど多様な攻撃に悪用されます。
仕組みと動作原理
XSSの3種類
反射型XSS(Reflected XSS)
攻撃者が用意した悪意のあるURLをユーザがクリックすることで発動。スクリプトはサーバを経由して反射される。
攻撃者 → 悪意のあるURL(スクリプト入りパラメータ)を被害者に送信
被害者 → URLをクリック
サーバ → URLパラメータをそのままレスポンスに埋め込んで返す
ブラウザ → スクリプトが実行される
特徴: 永続しない・URLに悪意のあるコードが含まれる・フィッシングメールとの組み合わせが多い
格納型XSS(Stored XSS)
攻撃スクリプトがDBやファイルに保存され、ページを閲覧する全ユーザに影響。
攻撃者 → 悪意のあるスクリプトをコメント欄等に投稿
DB → スクリプトを保存
被害者 → そのページを閲覧
ブラウザ → スクリプトが実行される
特徴: 永続的・多数のユーザに影響・管理者が感染するとさらに被害拡大
DOM型XSS
サーバを経由せず、クライアントサイドのJavaScriptがDOMを操作する際に発動。サーバのレスポンスには悪意のあるコードが含まれない。
// 脆弱なコード
document.getElementById('output').innerHTML = location.hash.substring(1);
// URL: https://example.com/#<script>alert(1)</script>
特徴: サーバログに残らないため検出困難・innerHTML・eval()・document.write() が危険な操作
主な被害と攻撃パターン
| 攻撃 | 説明 |
|---|---|
| セッションハイジャック | document.cookie でセッションCookieを盗取 |
| フィッシング | 偽のログインフォームをページに挿入 |
| キーロガー | フォーム入力をリアルタイムに外部送信 |
| マルウェア配布 | ページにドライブバイダウンロードを仕込む |
| CSRF トリガー | XSSからCSRFリクエストを発火 |
対策
| 対策 | 説明 | 効果 |
|---|---|---|
| 出力時エスケープ | <>&"' → HTMLエンティティに変換 | ◎ 根本対策 |
| CSP(Content Security Policy) | スクリプト実行元を制限するHTTPヘッダ | ○ 軽減策 |
| HTTPOnly Cookie | JavaScriptからCookieを読み取れなくする | ○ 被害限定(セッション盗取防止) |
| Secure Cookie | HTTPS通信のみCookieを送信 | ○ |
| 入力値検証 | 想定外の入力を拒否 | △ 補完的(エスケープとの併用が必要) |
| DOMPurify等のサニタイザ | HTML入力を許可する場合の安全な処理 | ○ |
CSP(Content Security Policy)の例
Content-Security-Policy: default-src 'self'; script-src 'self' https://cdn.example.com
- インラインスクリプト(
<script>alert(1)</script>)を禁止 - 許可されていないドメインからのスクリプト読み込みを防止
SC試験での頻出ポイント
- 3種類の XSS の違いと被害:特に格納型 vs 反射型の区別
- HTTPOnly 属性の目的:JavaScript から Cookie を読み取れなくする(セッション盗取防止)
- CSP の役割:XSS が発火しても外部への情報送信を防ぐ深層防御
- DOM型XSSのサーバ側対策の限界:サーバレスポンスには問題がないため、クライアント側コードのレビューが必要
- 反射型XSSの配布方法:フィッシングメール・掲示板への悪意URLの投稿
よくある誤問・ひっかけパターン
誤り① 「HTTPOnly Cookie を設定すれば XSS を完全に防げる」→ 誤。HTTPOnly はセッション Cookie の盗取を防ぐだけで、XSS 自体は防げません(他の攻撃は可能)。
誤り② 「格納型 XSS は格納時に入力値をチェックすれば防げる」→ 不十分。入力時の検証ではなく、出力時のエスケープが根本対策です。
誤り③ 「DOM型 XSS はサーバサイドのエスケープで防げる」→ 誤。DOM型は JavaScript による DOM 操作に起因するため、クライアントサイドの安全な API(textContent、setAttribute 等)の使用が対策です。
関連用語
- SQLインジェクション — 同じく入力値処理の脆弱性
- CSRF — XSS と組み合わせて CSRF 攻撃が行われることがある
- ファイアウォールとDMZ — WAF が XSS の補完的対策
重要キーワード
| 用語 | 説明 |
|---|---|
| 反射型XSS | URLパラメータのスクリプトがサーバを通じて反射される型 |
| 格納型XSS | スクリプトがDBに保存され閲覧者全員に影響する永続型 |
| DOM型XSS | JavaScriptのDOM操作に起因するクライアントサイドXSS |
| CSP | スクリプト実行元を制限するHTTPレスポンスヘッダ |
| HTTPOnly | JavaScriptからCookieを読み取れなくする属性 |
| 出力エスケープ | 表示時にHTML特殊文字をエンティティに変換する根本対策 |