セッションハイジャック

セッションハイジャックは不正に取得したセッションIDを使って正規ユーザのセッションを乗っ取る攻撃を言います。乗っ取られると正規ユーザができる操作の全てが実行でき、大きな被害を生む可能性があります。

セッション固定攻撃によるセッションIDの漏洩

セッション固定攻撃は、強制的に任意の固定したセッションIDを使わせる攻撃です。php.iniの設定で、「session.use_cookies = 0」「session.use_only_cookies = 0」となっている場合に発生し、URLの末尾に「?PHPSESSID=適当な英数字」を指定することで、セッションの固定IDを使うことができてしまいます。

リファラーによるセッションIDの漏洩

リファラーとは、リンク元のページ情報です。仮にAというサイトに張られたリンクを辿ってBというサイトに移動した際、Aのサイトで取得した情報がBのサイトにも渡ります。その中にはURL情報も含まれており、もしcookie以外で方法でセッションIDを管理している場合、そのセッションIDが漏洩する可能性があります。PHPの初期値ではクッキーによる管理となっていますが、php.iniの設定で「session.use_only_cookies = 0」「session.use_trans_sid = 1」としている場合は注意が必要です。

XSSによるセッションIDの漏洩

XSSは、クロスサイトスクリプティングのことです。PHPファイルで「session_start();」を指定し、php.iniの設定が「session.use_cookies = 1」の場合、フォームから「<script>alert(document.cookie)</script>」を入力するとGETでもPOSTでもアラートでセッションIDの情報を出力します。GETではURL末尾に「?word=<script>alert(document.cookie)</script>」を追加してリロードしても同様にアラートが表示されます。また、「<script>location.href="移動先ページ?"+document.cookie;</script>」といったようなものでもフォームから入力するとURLの欄に「?」へ追加された形でセッションIDの情報を出力します。いずれの場合もGETやPOSTでechoした場合にのみ出力されますが、通常はechoすると思いますので、注意が必要です。特にlocation.hrefを使って元のサイトにリダイレクトすれば、被害に合っていること自体が気づきにくいものです。

// PHP
session_start();
echo $_POST['word'];
// HTML
<form action="" method="post">
<input type="text" name="word" />
<input type="submit" value="投稿" />
</form>

対処法

基本的にphp.iniの設定で「session.use_cookies = 1」「session.use_only_cookies = 1」「session.use_trans_sid = 0」とし、cookieのみでセッションIDを管理します。session.use_cookiesはクッキーを使うかどうか、session.use_only_cookiesはクッキーのみでセッションIDを管理するかどうか、session.use_trans_sidはクッキーが使えない場合、URLにセッションIDを付加するという意味です。

php.iniの設定では他に「session.cookie_httponly = 1」や「session.cookie_secure =1」などの設定も有効です。「session.cookie_httponly」は、「1」を指定するとHTTPを通してのみクッキーへアクセスするようになり、JavaScriptのようなスクリプト言語からはアクセスできなくなります。ただし、httponly属性に対応していないブラウザからはセッションが利用できなくなります。「session.cookie_secure」は、セキュアな接続を通じてのみCookieを送信する場合「1」を指定します。ただし、HTTPとHTTPS間でのセッションは維持されません。

更にセキュリティーを強化するために、User-Agentなど端末特有の情報を元に乱数を生成して整合性をチェックするという方法があります。また、パスワードの多重チェックといった実装もありますが、こちらはサイトの利便性や操作性が下がるという欠点もあります。