セッションとは何か?
セッションとは、ログインしてからログアウトするまでのような一連の手続きのこと。
セッション管理を行うことで、通常ステートレスなHTTPにおいて、ログイン情報やオンラインショッピングシステムのカートなどの情報を保存して、必要な時に取り出すことができる。
セッションが必要なページにアクセスすると、サーバーから「セッションID」と呼ばれるセッション管理番号が発行されて、HTTPレスポンスに含まれる。
その際にはHTTPレスポンスに
Set-cookie: PHPSESSID=32geasfal3lf234e2332534; path=/
のような文字列が含まれている。(ここではPHPのsession_start();を用いた場合を示す)
上記のようにセッションIDはCookieとしてブラウザが記憶する。
以降、Cookieの期限が切れるまでか、ブラウザが閉じられるまで、このCookieのドメインとして指定されたサイトへのHTTPリクエストヘッダには
Cookie: PHPSESSID=32geasfal3lf234e2332534
が含まれる。
サーバーはこのセッションIDを受け取ることで、セッションを特定することができる。
セッションを用いた攻撃
セッションハイジャック
内容
他人のセッションIDを盗聴などで盗み、そのセッションIDを使って、その人になりすまして操作を行うこと。
例えばAさんが、セッションを開始する時に
Set-cookie: PHPSESSID=hoge;
とセッションIDを発行されたとする。このセッションID=hogeを何らかの方法でBさんが知り、HTTPリクエストにこのセッションIDを含ませる事で
Cookie: PHPSESSID=hoge;
BさんはAさんのセッションを乗っ取ることができる。
対策
セッションIDの漏洩を防ぐ(URLにセッションIDを含めない、SSLによる暗号化でネットワーク盗聴を防ぐ)
セッションIDの固定化(Session Fixation)攻撃
内容
セッションIDの固定化攻撃は、正規のサイトから悪意を持ったユーザが正規のセッションIDを取得し、そのセッションIDを他のユーザに強制する。
強制されたセッションIDでユーザがログインを行った場合、そのセッションIDを元々知っている悪意を持ったユーザはログインしたユーザに成り代わって操作を行うことができる。
対策
ログイン後にセッションを新規に作る(セッションIDの再発行)。
or
ログイン後にセッションIDとは別に認可されたことを証明する情報を付加する。