セッションハイジャック

※動作テストは自己責任で必ず自分の環境で確認すること。

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

ネットワーク上で一対の機器間で交わされる一連の通信(セッション)を途中で乗っ取り、片方になりすましてもう一方から不正にデータを搾取したり操作を行う攻撃。

コンピュータや通信機器の間の通信は多くの場合、人が電話をかける時のように、通信開始の手続き、データのやり取り、通信終了の手続き、が一定の手順に則って一連の流れとして行われコレをセッションという。

セッションハイジャックはこの一連のやり取りに不正に介入する攻撃で、偽造したデータを送りつけるなどの手法によりセッションを結んでいる片方になりすまし、もう一方と通信を行う。これにより、本来相手にしか開示されない秘密の情報を搾取したり、パスワードの変更などの重要な操作を不正に実行することができるようになる。

未知のセッション鍵を強制的に使わせたり、既存の未知鍵を盗むことで、他人のセッションを乗っ取る攻撃

■攻撃先

セッション管理部分全体

■被害

クレジットカード番号などの重要な個人情報が盗まれる。
Webアプリケーションの管理者権限を乗っ取られる。

Case 1

<?php
// session.use_only_cookies = 0の場合
session_start();
?>
サイト内の何処かに、以下のいずれかの攻撃を許す脆弱性が一箇所でもあれば、セッションハイジャックが可能となる。
・XSS攻撃
・Script Insertion攻撃
・HTTPレスポンス分割攻撃
・session関連の設定ミスによるリファラーURIからのセッション鍵漏洩

対策方法

・session関連の設定変更

session.use_trans_sid = 0
session.use_cookies = 1
session.use_only_cookies = 1
session.auto_start = 0

・IPアドレスチェック

鍵に結びついたセッションについてIPアドレスも保存しておき、異なるIPからの利用がなされた時点でセッションを破棄する。
セッション保護としては最も効果的である。
アクセスの都度、IPが変わるような環境では利用不可(携帯電話、ロードバランサによるラウンドロビンなど)

・セッション鍵の定期的な変更

一定時間ごとに、新しいセッション鍵に変更する。
<?php
session_start();
session_regenerate_id(true);
?>

・セッション鍵の整合性チェック

クッキーに不正なセッション鍵が書き込まれる可能性があるので、session_start()の実行前にセッション鍵の整合性チェックを行う。
<?php
if(preg_match('/[^0-9A-Za-z, -]/', $_COOKIE[session_name()]))
{
  exit;
}
session_start();
?>

補足

セッション管理はセキュリティ上、クッキーで行うべきである。
クライアントがクッキーの設定無効にしている場合は、有効にするように促す。
クッキー未対応の携帯端末については、専用のビューとコントローラーを別のディレクトリに作成し、その専用ディレクトリに以下の内容の.htaccessファイルを作成する。
php_flag session.use_trans_sid on
php_flag session.use_only_cookies off
i-mode等のIPアドレスのレンジは公開されているので、$_SERVER['REMOTE_ADDR']をチェックして、不正なIPレンジであればセッション開始までに処理を中断するコードを挿入する。

GETを利用したセッション管理のコードは以下の通り。
if(!empty($_GET[session_name()]) && empty($_COOKIE[session_name()]) && !preg_patch('/[^0-9A-Za-z, -]/', $_GET[session_name()]))
{
  $_COOKIE[session_name()] = $_GET[session_name()];
}

PHPサイバーテロの技法―攻撃と防御の実際

新品価格
¥1,890から
(2013/10/3 19:55時点)

Comments are closed.