- 2007-05-10 (木) 8:26
- PHP
セッション固定化(Session fixation)を調べている時に気づいたのですが、PHPではクエリ文字列内のセッションIDはクッキーとしては出力されないんですね。
良くセッション固定化で例に挙げられるが下のような例です。
- 攻撃者がセッションID付きURL[http://example.com/?PHPSESSID=abcd]をユーザAに踏ませる
- ユーザAのセッションが[セッションID=abcd]で生成される。
- ユーザAがログインする。
- 攻撃者が[セッションID=abcd]でアクセスするとユーザAがログイン済みの状態になっており、セッションを乗っ取る事ができる。
これ自体はもちろんそうなのですが、PHPではクエリ文字列に含まれるセッションIDでセッションは生成されますが、クッキーにそのセッションIDは出力されません。(PHP5.2.1のext/session/session.cを見るとそんな感じの実装です。)
2.の状態ではサーバ上に[セッションID=abcd]のセッションは存在しますが、そのセッションIDはクライアント側には知らされません。
3.でログイン情報をクライアントからサーバにPOSTで送信しますが、クライアントは2.でセッションIDの通知を受けていないので、セッションIDは送信しません。なのでサーバ上では新規セッションとして新しいセッションIDが生成されます。
その後、4.のように攻撃者が[セッションID=abcd]でアクセスしても、ログイン前のセッション(空のセッション)を参照するだけなので、当然ながら要ログインな画面へはアクセスできません。
つまり単純にセッションID付きURLを踏ませても、認証セッションを乗っ取るのは難しいのかなと。(かといってセッション固定化対策が不要なわけでは無いのであしからず。)
※これはセッションIDの受け渡しにクッキーを使っている場合の話です。携帯のようにクエリ文字列でセッションIDの受け渡しを行う場合は、例の手順でセッションを乗っ取ることができます。
- Newer: CakePHP Controller#Object()が外部から呼べる
- Older: Wiiリモコンが反応しない
コメント (Close):1
- yando 07-05-10 (木) 10:56
-
ためになりました。
トラックバック:0
- このエントリーのトラックバックURL
- /blog/2007/05/php_session_fixation.html/trackback
- Listed below are links to weblogs that reference
- クエリ文字列のセッションIDはクッキーには出力されない from Shin x blog