セッションフィクセーション 01 - yujitounai/helloworld GitHub Wiki

セッションフィクセーション/Session Fixation

クエリストリングにセッションIDがある件でのセッションフィクセーション

脆弱なソースコード(php)

<?php
ini_set('session.use_cookies', 1);
ini_set('session.use_only_cookies', 0);
ini_set('session.use_trans_sid', 1);

session_name('fixsessid');
session_start();


$page=filter_input(INPUT_GET,"page");
if(!$page){
    echo "<a href=\"?page=input\">input</a>";
}elseif($page==="input"){
    echo <<<EOM
<div class="box">
	<form method="post" action="?page=input_secret">secret
		<input name="secret" type="text" value="">
		<input type="submit">
	</form>
</div>
EOM;
}elseif($page==="input_secret"){
    $secret = filter_input(INPUT_POST,"secret");
    $_SESSION['secret']=$secret;
    echo "<a href=\"?page=display_secret\">display_secret</a>";
    echo "<br><a href=\"?page=logout\">clear session</a>";    
}elseif($page==="display_secret"){
    echo "SECRET=".$_SESSION['secret'];
    echo "<br><br>";
    echo "<a href=\"?page=input\">input</a>";  
    echo "<br><a href=\"?page=logout\">clear session</a>";
}elseif($page==="logout"){
    $_SESSION = array();
    session_destroy();
    echo "logout";
    echo "<br><br>";
    echo "<a href=\"?page=input\">input</a>";  
}
?>


アプリの使い方流れ

  1. sessionfixation-01.php を開くとsecretを入力する画面になる
  2. 入力するとdisplay_secretリンクが表示される
  3. display_secretを開くとsecretが表示される

攻撃

  1. inputをクリックするとセッションID fixsessidが作成される
  2. 発行されたセッションIDをクエリストリングに貼り付ける sessionfixation-01.php?page=input&fixsessid=[取得したfixsessid]
  3. 作成したURLを別のブラウザから開く
  4. secretを入力する
  5. 元のブラウザで sessionfixation-01.php?page=display_secret&fixsessid=[取得したfixsessid] を開くとURLを押しつけられた側が入力したSECRET値が表示される(Cookieにfixsessidがあるとそちらが優先されるので注意)

予防策

ini_set('session.use_trans_sid', 1); ini_set('session.use_only_cookies', 0);

はやらない

ログイン、ログインしてない場合でも重要な情報の送信後は

session_regenerate_id()

も使いたい

⚠️ **GitHub.com Fallback** ⚠️