利用者のセッション情報を奪い取って成りすます攻撃。
セッションハイジャックとは、ログイン中の利用者のセッション情報(セッションID)を奪い取り、その利用者になりすます攻撃のことです。ハイジャック=乗っ取りの意味です。
セッションIDとは、ログイン状態を表す通行証の番号のことです。Webサービスでは、ログインのたびにパスワードを送り直さなくて済むよう、ログイン後にこの番号が発行され、以降はそれで本人確認を行います。
身近な例で考えると、遊園地の再入場スタンプ(通行証)を他人に盗まれて、その人に成りすまして入られてしまう状態に似ています。上のツールで▶ボタンを押すと、攻撃者がセッションIDを盗み、本人になりすます流れを確認できます。
攻撃の核心は「有効なセッションIDを手に入れること」です。サーバはセッションIDだけで相手を本人と判断するため、IDやパスワードを知らなくても、有効な番号さえ盗めばなりすませてしまいます。
セッションIDを手に入れる主な手口は次のとおりです。
・盗聴:暗号化されていない通信を盗み見て、流れてきたセッションIDを奪う
・XSS(クロスサイトスクリプティング):不正なスクリプトをページに埋め込み、利用者のブラウザからCookie(=セッションIDを保存している小さなデータ)を盗み出させる
・推測:セッションIDが連番や規則的な値だと、次の値を予想して当てる
・セッションフィクセーション:攻撃者が用意したセッションIDを利用者にあらかじめ使わせ、ログイン後にそのIDを乗っ取る
どの手口でも、最終的には盗んだセッションIDを自分のリクエストに付けてアクセスするところは共通です。上のツールのSTEP3〜5で、盗んだIDを提示してサーバに本人と誤認させる流れを確認できます。
結論:サーバはセッション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を作り直すだけで防げます。
対策はどれも「どうやって盗まれるか」に直接対応しています。盗む手口と防ぎ方をセットで覚えると、問題を解くときに迷いにくくなります。
対策は「盗ませない」「推測させない」「盗まれても使わせない」の3方向で考えると整理しやすいです。
具体的な対策は次のとおりです。
・通信の暗号化(HTTPS):盗聴されてもセッションIDを読めなくする
・推測されにくい乱数のセッションID:連番にせず、当てられないようにする
・ログイン時にセッションIDを再生成:フィクセーション対策。古いIDを無効にする
・有効期限(タイムアウト)の設定:一定時間で失効させ、盗まれても使える時間を短くする
・Cookieのsecure/HttpOnly属性:暗号化通信でしか送らせず、スクリプトからも読めなくしてXSSでの盗難を防ぐ
身近な例で言えば、通行証を毎回作り直し、すぐ期限切れにし、コピーされにくいランダムな番号にするようなものです。上のツールのSTEP6で、暗号化と失効によって盗用が拒否される様子を確認できます。