ログイン前セッションフィクセイション
攻撃の脅威と対策

HASHコンサルティング株式会社
徳丸 浩
twitter id: @ockeghem
Copyright © 2013 HASH Consulting Corp.
モデルのアプリケーション
入力画面
メールアドレス foo@pexample.jp

セッション変数にメールアドレスがあれば、
修正のため入力欄にフィルする

確認
POST
<input name=”mail”
value=”foo@example.jp”>

確認画面
メールアドレス:foo@example.jp
戻る

メールアドレスをセッション変数に保存
$_SESSION[’mail’]=$_POST[’mail’];

登録

確認画面から登録画面にはセッションで受け渡し
登録画面
メールアドレスを登録しました

セッション変数空メールアドレスを取り出し
$mail=$_SESSION[’mail’];

Copyright © 2013 HASH Consulting Corp.

2
セッションIDを強制できると秘密情報が漏えい
攻撃者のPC

攻撃者がセッションIDを取得

何らかの方法で
セッションをセット

正規サイト

攻撃者用セッションID
攻撃者のセッションID
のまま個人情報を入力

被害者

攻撃者のセッション

被害者の
個人情報

あらかじめ取得した
セッションIDでアクセス
被害者の個人情報閲覧

Copyright © 2013 HASH Consulting Corp.

3
なんらかの方法って何?
• よく言われるのは以下のいずれかの場合
– セッションIDがURL埋め込みになっているサイト(ケータイサイト等)
– セッションIDがPOSTパラメータの場合(あまり見ない)
– 地域型JPドメイン名、都道府県型JPドメイン名のサイト

• CookieにセッションIDがあり、汎用JPドメイン名や、.COM等
の場合は気にしなくていいのでは?

Copyright © 2013 HASH Consulting Corp.

4
No!
SSLを使っているサイトの場合は駄目

Copyright © 2013 HASH Consulting Corp.

5
通信路上に攻撃者がいる光景
通信路上の攻撃者
正規サイト
攻撃者がセッションIDを取得

ワナでHTTP
ページに誘導
被害者

攻撃者用セッションID

http://example.jp

攻撃者のセッション

Set-Cooki: ….
https://example.jp
HTTPSは盗聴・
改ざんできない

evil …
Copyright © 2013 HASH Consulting Corp.

被害者の
個人情報

example.jp
6
なぜSSLの場合だけ?
• SSL使う場合だけ脆弱となるのは違和感があるが…
• SSL使わない場合、通信路上に攻撃者がいると、
セッションフィクセイション脆弱性がなくても、
セッションIDを盗聴することで、なりすましは可能
• SSLを採用しないサイトは、通信路上の攻撃者はいないもの
と見なしている(安全な回線で使ってね。ニコッ)
• SSLを使用しているサイトは通信路から攻撃に対処しているこ
とが想定される(お・も・て・な・し♡)ので、通信路からの攻撃で
盗聴・改ざん等ができてはいけない
• そうでないと…当サイトはSSLを使用してお客様の通信を安
全に暗号化しています。ただし、通信路上に攻撃者がいる場
合には、その限りではありません …となってしまう

Copyright © 2013 HASH Consulting Corp.

7
ログイン前セッションフィクセイションの対象サイトは?
1. 未ログインの状態でセッション変数に秘密情報を保持 かつ
2. セッションIDを外部から強制できる(以下は例)
–
–
–
–

URLにセッションIDを埋め込んでいるサイト
地域型JPドメイン名、都道府県型JPドメイン名上のサイト
SSLを使用しているサイト
Cookie書き換えできる脆弱性(XSS、HTTPヘッダインジェクション
等)を持つサイト
– 同じドメインのサブドメイン上にCookie書き換えできる脆弱性があ
るサイトがある場合
例: sub.example.jp にXSS脆弱性やHTTPヘッダインジェクション
脆弱性があると、www.example.jp もCookieをセット可能
– …

• 2.はきりがないので、1.が該当するならば、ログイン前セッショ
ンフィクセイション脆弱性対策するのが良い
Copyright © 2013 HASH Consulting Corp.

8
デモ
ワナサイト
kawaguchi.tokyo.jp

IEはdomain=tokyo.jpの
ドメインを受け入れる
(Cookie Monster Bug)
被害者

ワナを閲覧
攻撃者用
セッションID
正規サイト
urayasu.tokyo.jp

被害者の
個人情報

PHP 5.5.6
session.use_strict_mode=1

Copyright © 2013 HASH Consulting Corp.

9
対策案(1)
入力ページの前の「入り口ページ」でセッションIDを振り直す
被害者

入口

入力画面

登録を始めます
入力

foo@pexample.jp

確認

確認画面
foo@pexample.jp

登録画面
登録しました

登録

セッションID
を振り直す

Copyright © 2013 HASH Consulting Corp.

10
対策案(1)の対抗策
ワナサイトから入力画面にショートカットして誘導する
被害者

ワナサイト
入力画面はこちら

誘導

入口

入力画面

登録を始めます
入力

foo@pexample.jp

確認

確認画面
foo@pexample.jp

登録画面
登録しました

登録

セッションID
を振り直す

Copyright © 2013 HASH Consulting Corp.

11
対策案(2)
対策案(1)に加え、トークンにより画面遷移を制限する
ワナサイト

被害者

入力画面はこちら

誘導

入口

入力画面

登録を始めます
入力

確認画面
foo@pexample.jp

foo@pexample.jp

token

確認

登録画面

token

登録

登録しました
token

セッションID再生成
トークン生成

Copyright © 2013 HASH Consulting Corp.

12
対策案(2)の対抗策
クッキーとトークンを正規サイトから取得して、入力画面に強制
被害者

ワナサイト
入力画面はこちら

token
Cookie

誘導

入口

入力画面

登録を始めます
入力

確認画面
foo@pexample.jp

foo@pexample.jp

token

確認

登録画面

token

登録

登録しました
token

セッションID再生成
トークン生成

Copyright © 2013 HASH Consulting Corp.

13
ではどうすれば良いか?
• リクエスト毎に毎回セッションIDを振り直すというアイデア
– 安全だが、1回でもレスポンスを取りこぼすと、セッションが無効に
なってしまう
– 過去のセッションを有効なまま残せば、前画面の状態までは戻れる
– 過去のセッションを残すことの妥当性に関する議論

• 実は、リクエスト毎にセッションIDを振り直す必要はない
• セッション変数に秘密情報をセットする場合のみ、セッションID
を振り直せばよい
– 秘密情報をセットする前のセッションは、攻撃者のセッションを引き
継いでいるだけなので、漏れても害はない

• あるいは、ログイン前にはセッションを開始しないで、hidden
パラメータでデータを引き回す【推奨】

Copyright © 2013 HASH Consulting Corp.

14
まとめ
• ログイン前セッションフィクセイション脆弱性は、意外に多くの
サイトが対象となる
• ログイン前セッションフィクセイションの脅威は、セッションに格
納された秘密情報の漏洩など
• 「外部からCookieをセットする攻撃経路」は多様であり、もれ
なくつぶすことが困難
• ログイン前にはセッションを開始しないことを推奨
• やむを得ずログイン前にセッションを開始する場合は、
セッション変数に秘密情報をセットするページで、
セッションIDを振り直す

Copyright © 2013 HASH Consulting Corp.

15
Thank you

Copyright © 2013 HASH Consulting Corp.

16

ログイン前セッションフィクセイション攻撃の脅威と対策