PHPのSession Adoptionは重大な脅威ではない


PHP?25 PHPPHPSession Adoption調
 

大垣氏の主張


 PHPSession AdoptionSession Fixationsession_regenerate_id()


PHPsession_regenerate_id
 25 PHP    

 便


Session FixationID

PHPsession_regenerate_id()

PHPSession Adoption

Cookie


 

Cookie Monsterバグ


 CookieCookieCookiedomainpathCookie


例:
Set-Cookie: HOGE=123; domain=hash-c.co.jp
Set-Cookie: HOGE=456; domain=www.hash-c.co.jp


 CookieCookie




Cookie MonsterCookie


 2Cookie Monster .co.jp CookieNetscape/MozillaSafari*1Cookie


Set-Cookie: PHPSESSID=jtcok9spkmvusm67cvo8us0df2; domain=.co.jp


 .co.jpPHPSESSIDCookiePHP
 Session Adoption


Set-Cookie: PHPSESSID=AAA; domain=.co.jp


 AAAIDPHPIDCookie.co.jpPHPPHPID
 Session FixationIDSession FixationSession Fixation

Cookie Monsterバグを利用したSession Fixationのデモ


 Session Fixation
 top.phplogin.phpprofile.phptop.phpIDlogin.phpprofile.phpIDex.phpex()HTML

http://example.co.jp/top.php:
<?php
  require_once 'ex.php';
  session_start();
?>
<html>
<body>
セッションID:<?phpex(session_id()); ?><BR>
<form action="login.php" method="POST">
ユーザIDを入力:<input name="id"><br>
<input type="submit">
</form>
</body>
</html>

http://example.co.jp/login.php:
<?php
  require_once 'ex.php';
  session_start();
  $id = $_POST['id'];
  $_SESSION['id'] = $id;
?>
<html>
<body>
セッションID:<?phpex(session_id()); ?><BR>
<?phpex($id); ?>さん、ログイン成功です<BR>
<a href="profile.php">個人情報</a>
</body>
</html>

http://example.co.jp/profile.php:
<?php
  require_once 'ex.php';
  session_start();
?>
<html>
<body>
セッションID:<?phpex(session_id()); ?><BR>
ユーザID:<?phpex($_SESSION['id']); ?><BR>
</body>
</html>

 hogehoge.co.jp

http://hogehoge.co.jp/wana.html:
<html>
<head>
<META http-equiv="Set-Cookie" content="PHPSESSID=AAA; path=/; domain=.co.jp">
</head>
<body>
<a href="http://example.co.jp/top.php">example.co.jp</a>で楽しいキャンペーン開催中。
いますぐログインしてグッズをゲットしよう
</body>

 example.co.jpwana.htmlSafariMETA.co.jpPHPSESSID


.co.jpPHPSESSIDexample.co.jp

ID

PHPSESSIDAAA



 PHPSESSIDAAAPHPSESSID=AAAhttp://example.co.jp/profile.phpCookie Monster使Session Fixation Session Adoption使PHP(example.co.jp)IDID

session_regenerate_id()による対策


 Session Fixationsession_regenerate_id()login.phpsession_regenerate_id()ID

http://example.co.jp/login.php:
<?php
  require_once 'ex.php';
  session_start();
  $sid1 = session_id(); // 旧セッションIDの待避
  session_regenerate_id(); // 追加

  $id = $_POST['id'];
  $_SESSION['id'] = $id;
?>
<html>
<body>
旧セッションID:<?phpex($sid1); ?><BR>
現セッションID:<?phpex(session_id()); ?><BR>
<?phpex($id); ?>さん、ログイン成功です<BR>
<a href="profile.php">個人情報</a></body>
</html>

login.php

.co.jpID

Cookie Monsterバグの影響


 WebCookie


Cookie: PHPSESSID=AAA; PHPSESSID=89c21khagvg1iiq682pg2meq03
 

.co.jpPHPSESSID=AAAexample.co.jpPHPSESSID=89c21khagvg1iiq682pg2meq03AAA
CookieAAA


結局Session Adoptionは問題ではない


 session_regenerate_id()ID89c21khagvg1iiq682pg2meq0389c2...89c2...IDSession Fixation
 .co.jpCookieSafariCookie MonsterSession AdoptionPHP

大垣氏はどこで間違えたか


 (Cookie Monster)CookieSession Adoption 


wiki.ohgaki.netwww.ohgaki.netblog.ohgaki.net session_regenerate_idIDohgaki.netIDID
 http://gihyo.jp/dev/serial/01/php-security/0025?page=2  

 ohgaki.netPHPIDIDID
 PHPSession AdoptionPoC(Proof of Concept; )PoCPoC

まとめ


 Safari3Cookie MonsterSession AdoptionSession AdoptionSession FixationSession Adoptionsession_regenerate_id()Cookie Monster(Safari)AppleSafari4βSafariCookie Monster
 Session Adoption

*1:安定バージョンの最新版Safari3.2.3で確認。Safari 4βでは改修されている模様だ