セッションハイジャック 01 - yujitounai/helloworld GitHub Wiki

セッションハイジャック/Session Hijack

クエリストリングにセッションIDがある件でのセッションハイジャック

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

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

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. sessionhijack-01.php を開くとsecretを入力する画面になる
  2. 入力するとsecretが表示される(page=secret)

攻撃

  1. inputをクリックするとURLのクエリストリングにPHPSESSIDが漏れている
  2. referer、プロキシログなどでURLが漏れることを想定
  3. 別のブラウザから /sessionhijack-01.php?page=secret&PHPSESSID=[漏えいしたPHPSESSID] にアクセスすると別のブラウザの情報が閲覧できる

予防策

ini_set('session.use_trans_sid', 1);

はやらない

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

session_regenerate_id()

も使いたい

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