セッションのフィールドの情報はどこに保存されますか?たとえば、_$_SESSION['foo'] = 'bar'
_のようなものをセッションに保存するとします。 「バー」はどこに保存されていますか?
クラスのオブジェクトを格納すると、どのように格納されますか? $_SESSION['kart'] = new Kart(10)
のように。誰かがそのクラスに保存されている情報を入手できますか?どうやって?
そのセッションの正当な所有者はフィールド「foo」の値を変更できますか?
そして、誰かがすでに作成された他のユーザーのセッションでフィールド「foo」の値を変更できますか?
これは、使用するWebサーバーによって異なります。 PHP=を例に取ると、セッションは/ tmpフォルダーのファイルシステムに保存される可能性があります。ユーザーのセッションIDの名前にsess_が前に付いたファイルがここに作成されます(例:/ tmp/sess_9gk8f055hd61qll6a8pjpje2n2)セッションのコンテンツは、ブラウザに配置する前にオプションで暗号化できます。Apacheセッション(必ずしもPHPではない)の場合は、mod_session_cryptoモジュールを使用できます( 詳細はこちら )。
セッションの所有者は、アプリケーションで許可されていない限り、セッション変数を変更できません。ユーザーが変数を変更するために、アプリケーションロジックはセッションを変更する手段を提供する必要があります。
セッションオブジェクトはクライアントに送信されることはなく、セッションへの参照(PHPSESSIDなど)のみがクライアントに渡されます。セッションIDは、推測が非常に難しくなるように、エントロピーが高く、長さが16バイト以上である必要があります。詳細については OWASP Top 10-Broken authentication and session management を参照してください。セッションを保護する方法の詳細については、こちら OWASPチートシート も参照してください。
セッションストレージに対する攻撃:
LFI(ローカルファイルインクルージョン)などの欠陥が存在する場合、ファイルシステムにファイルを含めることにより、攻撃者が自分や他のユーザーのセッションオブジェクトを読み取る可能性があります。たとえば、次の例が機能した場合、自分のセッションデータを読み取ることができます。
http://<victim>/?page=../../../../../../../../tmp/sess_<my sessionid>