web-dev-qa-db-ja.com

XSS経由でPHPの$ _SESSION変数を変更しますか?

私の言っていることが理にかなっているかわかりません...しかし、ターゲットの外部から$ _SESSION変数を変更することは可能ですかPHPスクリプト?

私たちのスクリプトの1つは$ _SESSION変数を使用していますが、$ _ POST変数が外部からの操作に対して脆弱かどうかはわかりません...

4
Steve

これに対する答えは、アプリケーションがGETまたはPOST dataを使用してSESSIONデータに入力するかどうかによって異なります。

たとえば、ユーザーが次のようにログインすると、$ _ SESSION ['username']が入力されるとします。

$_SESSION['username'] = $_GET['login-username']

XSSはクライアントを所有しているため、login-username変数の内容を変更して、セッション変数を制御することもできます。

ただし、$ _ SESSIONグローバル変数配列はサーバー側でのみ変更できることを知っておくことが重要です。

8
Chris Dale

$_SESSION変数がクライアントに送信されることはありません。これはサーバーにのみ保存されます。ユーザーはIDのみを取得します。これは、対応する$_SESSION変数をロードするためにPHPが使用します。

したがって、XSSを排他的に使用することにより、$_SESSION変数を変更することはできません。

明確化

$_SESSION['password'] = $varのような行がコードのどこにもない場合、XSSは$_SESSION['password']の値を変更できません。

1
Mike

マイクは良い答えを持っています。なぜ彼が反対票を投じられたのかはわかりません(だから私は彼を反対票を投じました)。参加したばかりなのでコメントはできませんが、マイクの説得力について説明したいと思います。

元の質問は:

私たちのスクリプトの1つは$ _SESSION変数を使用していますが、$ _ POST変数が外部からの操作に対して脆弱かどうかはわかりません...

私はこれを「ユーザーは$ _COOKIE、$ _ POST、および$ _GETでできるように、HTTPリクエストから直接$ _SESSIONを操作できますか?」

言い換えると、PHPは文字どおり要求ヘッダーまたは本文からユーザーデータを取得し、これら3つのスーパーグローバルに隠します。しかし、それは$ _SESSIONに対して同じことをしますか?

答えは(ほとんどの場合)間違いなくノーです。 PHPのデフォルトのセッションストレージは「ファイル」です。つまり、セッションはシリアル化され、ローカルファイルシステム上のファイルに書き込まれます。ユーザーは、セッションのコンテンツを直接操作する方法がありません。

さて、他の人が上で指摘したように、次のようなことをすると:

$_SESSION['foo'] = $_POST['bar'];

次に、ユーザーは$ _POSTに影響を与えることにより、間接的に$ _SESSIONに影響を与えることができます。もちろん、これは本当ですが、これが問題のポイントであるとは思いませんでした。ユーザー何かに影響する可能性がありますユーザー入力をサニタイズしない場合。重要なのは、どの入力がサニタイズされていないかを知り、それらを使用する前にそれらをサニタイズする方法を知ることです。

上記のKarraxの批判は次のとおりです。

XSSがセッション変数で使用されるクライアントの値を変更する場合、XSSを使用して$ _SESSIOnを正常に変更しました。

もちろん、これは本当ですが、問題のポイントではありません。あなたの論理では、「悪意のあるユーザー入力が月にロケットを発射する可能性がある」とも言えます。これは真の声明です NASAの誰かがロケット制御アプリケーションでのユーザー入力のサニタイズを忘れた場合、それはNASAのソフトウェアの問題であり、PHPに固有のリスクではありません。

残念ながら、PHPは汚染されていないスーパーグローバルと汚染されているスーパーグローバルを明確にしません。この違いを理解するには、HTTPプロトコルの中間レベルの理解と、PHPランタイムがHTTP要求と応答サイクルを処理する方法が必要です。

1
Mark E. Haase