セッション固定/ハイジャックのリスクについて SO に関する多くの Q/A を読み、多くの人が to などのディレクティブや他の php.ini ディレクティブを変更して、サーバーをより安全にすることを提案してphp.ini
います...session.use_only_cookies
ON
PHP5 + Apache ベースのローカルホスト サーバーで単純な攻撃シナリオを再現できるかどうか、この目で確かめたかったのです。
私のローカルホストsession.use_only_cookies
ではOFF
、上記のq/aによると、私のローカルホストは基本的に保護されていないため、テストを行う必要があります。
セッション固定攻撃がどのように実行されるかについて、この簡単な記事を最初に読みました。
この記事で説明したシナリオを再現するために、2 つの非常に単純な PHP スクリプトを作成しました (コードは以下にあります) が、攻撃は機能しません。
(マロリーのふりをして) 私はアリスに言います: 「こんにちは、http://localhost/login.php?PHPSESSID=mysessionidにアクセスしてください」</p>
それから (アリスのふりをして) http://localhost/login.php?PHPSESSID=mysessionidに行きました
私のローカルホスト サーバーの管理者として、セッションがサーバー ディスク上に作成されているのを見た (それは という名前のファイルとして作成されている
sess_ mysessionid
) ので、私は思った: かっこいい、動いている!!!次に (アリスのふりをして) 資格情報として「joe」と入力してログインしました
アリスがログインすると、彼女は にリダイレクトさ
insession_ok.php
れます。この時点で (上記のウィキペディアの記事によると)、マロリーはセッションを に固定しているため、マロリーも見ることができるはずですがinsession_ok.php
、これは正しくありません。アリスが新しいセッションにログインすると、 serverで作成されたので、記事で説明されているように、マロリーがどのようにセッションを固定/ハイジャックすることになっているのか、この時点では理解できませんか???mysessionid
sess_vdshg238cnfb4vt7ahpnp1p522
login.php
<?php
session_start();
//if user credentials are ok, let's put him in session
if( @$_POST['usr'] === 'joe' )
$_SESSION['in_session'] = TRUE;
//if user is already logged in, let's redirect him to the account page "insession_ok.php"
if( isset($_SESSION['in_session']) )
{
$webpage = 'http://' . $_SERVER['HTTP_HOST'] . '/insession_ok.php';
header("Location: " . $webpage, TRUE, 302);
}
?>
<form method="POST" action="login.php">
<input name="usr" type="text">
<input type="submit" value="Submit">
</form>
<script type="text/javascript">
alert(document.cookie); //to view cookies
</script>
insession_ok.php
<?php
session_start();
if(@$_SESSION['in_session'] === TRUE)
echo "in session ok";
else //user is not in session cause he did not login, let's redirect him to login page
{
$webpage = 'http://' . $_SERVER['HTTP_HOST'] . '/login.php';
header("Location: " . $webpage, TRUE, 302);
}
?>
手がかり/アイデアはいつでも大歓迎です!