FE EXAM

セッションハイジャック(乗っ取り)

利用者のセッション情報を奪い取って成りすます攻撃。

INTERACTIVE VISUALIZATION
正規利用者
攻撃者
サーバ
状況
待機中
攻撃者が握るID
サーバの認識
シナリオ
ステップ1 / 6
STEP 1/6ログインする前まだ何も起きていない状態です。これから正規利用者(=本来のアカウントの持ち主)がサーバにログインします。Webサービスでは、ログインのたびにIDとパスワードを送り直さなくて済むよう、ログイン後に「セッションID」という通行証が発行されます。
正規利用者攻撃者サーバ▶ を押すと攻撃の流れが始まります
解説

📌
セッションハイジャックとは

正規利用者サーバ攻撃者SID=...盗む

セッションハイジャックとは、ログイン中の利用者のセッション情報(セッションID)を奪い取り、その利用者になりすます攻撃のことです。ハイジャック=乗っ取りの意味です。

セッションIDとは、ログイン状態を表す通行証の番号のことです。Webサービスでは、ログインのたびにパスワードを送り直さなくて済むよう、ログイン後にこの番号が発行され、以降はそれで本人確認を行います。

身近な例で考えると、遊園地の再入場スタンプ(通行証)を他人に盗まれて、その人に成りすまして入られてしまう状態に似ています。上のツールで▶ボタンを押すと、攻撃者がセッションIDを盗み、本人になりすます流れを確認できます。

🎭
攻撃の手口

攻撃の核心は「有効なセッションIDを手に入れること」です。サーバはセッションIDだけで相手を本人と判断するため、IDやパスワードを知らなくても、有効な番号さえ盗めばなりすませてしまいます。

セッションIDを手に入れる主な手口は次のとおりです。
盗聴:暗号化されていない通信を盗み見て、流れてきたセッションIDを奪う
XSS(クロスサイトスクリプティング):不正なスクリプトをページに埋め込み、利用者のブラウザからCookie(=セッションIDを保存している小さなデータ)を盗み出させる
推測:セッションIDが連番や規則的な値だと、次の値を予想して当てる
セッションフィクセーション:攻撃者が用意したセッションIDを利用者にあらかじめ使わせ、ログイン後にそのIDを乗っ取る

どの手口でも、最終的には盗んだセッションIDを自分のリクエストに付けてアクセスするところは共通です。上のツールのSTEP3〜5で、盗んだIDを提示してサーバに本人と誤認させる流れを確認できます。

💡
なぜパスワードなしでなりすませるのか

① ログイン時: 通行証(セッションID)が発行される正規利用者サーバID+パスワードで認証② サーバがセッションIDを返す(通行証の交付)SID=abc123③ 攻撃者がそのIDを盗む攻撃者SID=abc123サーバは「abc123を持っている → 本人」と判断してしまう

結論:サーバはセッションIDだけで本人確認するからです。なぜそうなっているかというと、Webの仕組みにあります。

Webのリクエスト(ページを開く要求)は1回ずつ完全に独立していて、サーバは「誰からの要求か」を覚えていません(これをステートレス=状態を持たないと言います)。そのため、ログイン中であることを示す手段としてセッションID(Cookie に保存された番号)が使われます。サーバはリクエストのたびに「このIDを持っているなら本人」と判断します。

つまり、パスワードは最初のログイン時しか使われず、以降はセッションIDが通行証の役割を果たします。だから攻撃者はパスワードを知らなくてもよく、盗んだセッションIDを自分のリクエストに付けるだけでなりすませてしまいます。有効なIDを持っている人を、サーバは本人と見なすしかないからです。

📌
盗まれ方と対策の対応

盗まれ方なぜ盗めるか対策
盗聴通信が暗号化されていないHTTPSで暗号化 / secure属性
XSS(スクリプト注入)悪意あるスクリプトがCookieを読み取れるHttpOnly属性でスクリプトから読めなくする
ID推測連番など規則的なIDを使っている乱数で生成し予測不可能にする
セッションフィクセーションログイン後もIDを変えないログイン成功時にIDを再生成する

XSS(クロスサイトスクリプティング)とは、Webページに悪意ある小さなプログラム(スクリプト)を埋め込み、ページを見た利用者のブラウザ上で動かす攻撃のことです。この攻撃でCookie(=セッションIDを保存している小さなデータ)が盗まれます。

セッションフィクセーションとは、攻撃者があらかじめ用意したセッションIDを利用者に使わせておき、その人がログインした瞬間に「有効なIDを持った状態」になった通信を乗っ取る手口です。ログイン時にIDを作り直すだけで防げます。

対策はどれも「どうやって盗まれるか」に直接対応しています。盗む手口と防ぎ方をセットで覚えると、問題を解くときに迷いにくくなります。

🛡️
対策

🔒 HTTPSで盗ませない🎲 乱数IDで推測させない⏲ 失効・再生成で使わせない

対策は「盗ませない」「推測させない」「盗まれても使わせない」の3方向で考えると整理しやすいです。

具体的な対策は次のとおりです。
通信の暗号化(HTTPS):盗聴されてもセッションIDを読めなくする
推測されにくい乱数のセッションID:連番にせず、当てられないようにする
ログイン時にセッションIDを再生成:フィクセーション対策。古いIDを無効にする
有効期限(タイムアウト)の設定:一定時間で失効させ、盗まれても使える時間を短くする
Cookieのsecure/HttpOnly属性:暗号化通信でしか送らせず、スクリプトからも読めなくしてXSSでの盗難を防ぐ

身近な例で言えば、通行証を毎回作り直し、すぐ期限切れにし、コピーされにくいランダムな番号にするようなものです。上のツールのSTEP6で、暗号化と失効によって盗用が拒否される様子を確認できます。

練習問題

🎯
基本情報技術者 練習問題

Q1.セッションハイジャックの説明として最も適切なものはどれか。
A.利用者のセッション情報を奪い取って成りすます攻撃
B.サーバの記憶領域を使い切らせて停止させる攻撃
C.暗号鍵を総当たりで解読する攻撃
D.正規サイトに似せた偽サイトへ誘導する攻撃
Q2.セッションハイジャックで、攻撃者がIDやパスワードを知らなくてもなりすませてしまう理由はどれか。
A.サーバがパスワードを保存していないから
B.サーバが提示されたセッションIDだけで相手を本人と判断するから
C.パスワードは通信に流れないから
D.攻撃者がサーバの管理者権限を持っているから
Q3.セッションハイジャックへの対策として適切でないものはどれか。
A.通信をHTTPSで暗号化し、Cookieにsecure属性を付ける
B.推測されにくい乱数のセッションIDを使い、一定時間で失効させる
C.ログイン成功時にセッションIDを再生成する
D.セッションIDを連番にして管理しやすくする

関連コンテンツ