6

セッション固定/ハイジャックのリスクについて SO に関する多くの Q/A を読み、多くの人が to などのディレクティブや他の php.ini ディレクティブを変更して、サーバーをより安全にすることを提案してphp.iniいます...session.use_only_cookiesON

PHP5 + Apache ベースのローカルホスト サーバーで単純な攻撃シナリオを再現できるかどうか、この目で確かめたかったのです。

私のローカルホストsession.use_only_cookiesではOFF、上記のq/aによると、私のローカルホストは基本的に保護されていないため、テストを行う必要があります。

セッション固定攻撃がどのように実行されるかについて、この簡単な記事を最初に読みました。

この記事で説明したシナリオを再現するために、2 つの非常に単純な PHP スクリプトを作成しました (コードは以下にあります) が、攻撃は機能しません。

  1. (マロリーのふりをして) 私はアリスに言います: 「こんにちは、http://localhost/login.php?PHPSESSID=mysessionidにアクセスしてください」</p>

  2. それから (アリスのふりをして) http://localhost/login.php?PHPSESSID=mysessionidに行きました

  3. 私のローカルホスト サーバーの管理者として、セッションがサーバー ディスク上に作成されているのを見た (それは という名前のファイルとして作成されているsess_ mysessionid) ので、私は思った: かっこいい、動いている!!!

  4. 次に (アリスのふりをして) 資格情報として「joe」と入力してログインしました

  5. アリスがログインすると、彼女は にリダイレクトさinsession_ok.phpれます。この時点で (上記のウィキペディアの記事によると)、マロリーはセッションを に固定しているため、マロリーも見ることができるはずですがinsession_ok.phpこれは正しくありません。アリスが新しいセッションにログインすると、 serverで作成されたので、記事で説明されているように、マロリーがどのようにセッションを固定/ハイジャックすることになっているのか、この時点では理解できませんか???mysessionidsess_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);
}
?>

手がかり/アイデアはいつでも大歓迎です!

4

2 に答える 2

6

これは、私がセッション固定攻撃をテストするために常に使用してきた方法です。これには HTTP プロトコルの知識が必要ですが、セッションの固定化を理解するのに十分な知識があれば、HTTP の少しの知識は怖くありません :)

ここで見ているセッション固定のバージョンは、図書館に行き、www.myawesomesite.com のようなサイトに移動し、ログインせずにセッション ID を書き留める、公共のコンピューターのアイデアです。あなたに配属されました。

次に、誰かが www.myawesomesite.com にログインするのを待ちます。彼らがログインしたらすぐに、自分のコンピューターのセッションを、公共のコンピューターで使用されていた Cookie に手動で変更します。サーバーは、あなたが認証されたユーザーであると認識します。

これを localhost でテストするために、2 つの異なるブラウザーを使用して効果を確認できます。これは、ブラウザーは通常 Cookie を共有しないためです。

これを行う手順は次のとおりです。

  • Chrome を開き、 に移動しlocalhostます。これは、公共のコンピューターを表します。セッション ID を調べて書き留めます。これを行うには、Fiddler などのプログラムを使用してリクエストを表示するか、Web Developer などのプラグインを使用して Cookie を表示します。Cookie の値は次のようになります。PHPSESSID=46l11p0vt81ouo2hkt0ck8ij76

  • Firefox を開き、 に移動しlocalhostます。これは、攻撃者のコンピューターを表します。Web Developer プラグインを使用して、PHPSESSID Cookie を Chrome から書き留めた値に変更します。

  • Chrome で Alice としてログインします。これは、被害者のログインを表します。

  • Firefox に戻り、[更新] をクリックするか、認証専用ページに移動します。セッション固定の影響を受けやすい場合は、ログインをバイパスして、Firefox で Alice としてログインする必要があります。

これの修正は簡単です (あなたが見たことがあると確信しています)。session_regenerate_id()コードでユーザーが認証されたらすぐに呼び出すだけです。これにより、ログイン前に使用されたすべてのセッション ID が無効になり、Oscar はログイン(ログアウト前) にセッション ID を盗もうとする必要がありますが、これははるかに困難です。

于 2011-05-11T15:59:32.227 に答える
1

session.use_only_cookiesを無効にすることとは別に、 PHP が優先$_COOKIEする有効なセッション ID Cookie が現在存在しないことも確認する必要があります$_GET。実際、ログイン後に別のセッション ID を持つ Alice の原因は、おそらく Alice が、URL 経由で提供されたセッション ID の代わりに使用されるセッション ID を持つ有効な Cookie を持っているためです。Cookie を無効にしてsession.use_trans_sidを有効にして、Cookie をまったく回避することもできます。

その後、エクスプロイトは期待どおりに機能するはずです。

于 2011-05-11T16:29:00.143 に答える