セッションファイルを介して攻撃するには?
PHP 4 以降のバージョンでは、セッションのサポートが提供されます。その主な機能は、PHP プログラムのページ間の状態情報を保存することです。たとえば、ユーザーが Web サイトにログインすると、ログインしたという事実と Web サイトにログインしたユーザーに関する情報がセッションに保存され、Web サイトを閲覧すると、すべての PHP コードがこの状態を取得できます。情報。
実際、セッションが開始されると (実際には、最初のリクエストで自動的に開始するように構成ファイルで設定されます)、ランダムな「セッション ID」が生成されます。リモート ブラウザがリクエストの送信時に常に送信する場合、この「セッション ID」を使用すると、セッションは常に維持されます。これは、Cookie を使用するか、各ページでフォーム変数 (「セッション ID」を含む) を送信することで簡単に実現できます。 PHP プログラムはセッションを使用して特別な変数を登録でき、その値は各 PHP スクリプトの終了後にセッション ファイルに保存され、各 PHP スクリプトの開始前にも変数にロードされます。簡単な例を次に示します:
<?php
session_destroy(); // 現在セッション内のデータをすべて削除します
$session_auth = "ショーン";
session_register("session_auth"); // $session_auth をセッション変数として登録します
?>
|
新しいバージョンの PHP では、「$session_auth」の値が自動的に「shaun」に設定され、将来のスクリプトは変更された値を自動的に受け入れるようになります。これはステートレス Web ツールにとっては非常に良いことですが、注意する必要もあります。 。
明らかな問題は、変数がセッションから取得されたものであることを確認することです。たとえば、上記のコードの場合、後続のスクリプトは次のとおりです。
<?php
if (!empty($session_auth))
// ここでサイトへのアクセスを許可します
?>
|
上記のコードは、「$session_auth」に値が割り当てられている場合、その値はユーザー入力からではなくセッションから割り当てられていると想定しています。攻撃者がフォーム入力を通じて値を割り当てた場合、攻撃者はサイトにアクセスできるようになります。攻撃者は、この攻撃方法を使用する前に変数をセッションに登録する必要があることに注意してください。変数がセッションに配置されると、フォーム入力はすべて上書きされます。
セッション データは通常、ファイルに保存されます (場所は設定可能で、通常は「/tmp」)。このファイルには、変数名、変数タイプ、変数値が含まれます。その他のデータ。マルチホスト システムでは、ファイルが Web サーバーを実行しているユーザー (通常は誰も) として保存されるため、悪意のあるサイト所有者がセッション ファイルを作成して他のサイトにアクセスしたり、セッション ファイルの機密情報を検査したりする可能性があります。 。
セッション メカニズムは、攻撃者が自分の入力をリモート システム上のファイルに保存するための別の利便性も提供します。上記の例では、攻撃者は PHP コードを含むファイルをリモート システムに配置する必要がありますが、ファイル アップロードを使用してこれを実行できない場合は、通常、セッションを使用して自分の希望に従って変数に値を割り当て、その後、その値を推測します。セッション ファイルの場所を指定すると、ファイル名が「php」であることがわかっているため、ディレクトリを推測するだけで済みます。通常、ディレクトリは「/tmp」です。
さらに、攻撃者は任意に「セッション ID」(「hello」など)を指定し、この「セッション ID」を使用してセッション ファイル(「/tmp/sess_hello」など)を作成することもできますが、「セッション ID」 「」は文字と数字の組み合わせのみです。
データ型を介して攻撃するにはどうすればよいですか?
PHP には緩いデータ型があり、変数の型は変数が配置されているコンテキストによって異なります。例: "$hello" は値 "" を持つ文字列変数として開始されますが、評価中に整数変数 "0" になり、予期しない結果が生じる場合があります。 "$hello" の値が "000" と "0" の間で異なる場合、empty() によって返される結果は true ではありません。
PHP の配列は連想配列です。つまり、配列のインデックスは文字列型です。これは、「$hello["000"]」と「$hello[0]」も異なることを意味します。
たとえば、ある場所で変数が「0」であるかどうかをテストし、別の場所でそれを確認するために empty() を使用することは避けるべきです。
エラーが発生しやすい機能を介して攻撃するにはどうすればよいでしょうか?以下は、エラーが発生しやすい関数の詳細なリストです:
<PHPコード実行>
require(): 指定されたファイルの内容を読み取り、PHP コードとして解釈します
include(): 上記と同じ
eval(): 指定された文字列を PHP コードとして実行します
preg_replace(): 「/e」スイッチと一緒に使用すると、置換文字列は PHP コードとして解釈されます
<コマンド実行>
exec(): 指定されたコマンドを実行し、実行結果の最後の行を返します
passthru(): 指定されたコマンドを実行し、すべての結果をクライアントのブラウザーに返します
``: 指定されたコマンドを実行し、すべての結果を配列に返します
system(): passthru() と同じですが、バイナリデータを処理しません
Popen(): 指定されたコマンドを実行し、入力または出力を PHP ファイル記述子に接続します
<文書流出>
fopen(): ファイルを開き、PHP ファイル記述子に対応します
readfile(): ファイルの内容を読み取り、クライアントのブラウザに出力します
file(): ファイルの内容全体を配列に読み取ります
PHP のセキュリティを強化するには?
上記で紹介した攻撃はすべて、PHP4 のデフォルトのインストールで適切に実装できますが、PHP の構成は非常に柔軟であり、いくつかの PHP オプションを構成することで、これらの攻撃の一部に対抗することが完全に可能です。以下では、実装の難易度に応じていくつかの構成を分類します。
※難易度低め
**中低難易度
***中~高難易度
****高難易度
PHP が提供するすべてのオプションを使用すると、サードパーティのコードを使用する場合でも、PHP の機能の多くが使用できなくなるため、PHP は非常に安全になります。
**** 「register_globals」を「off」に設定します
このオプションは、PHP によるユーザー入力のグローバル変数の作成を無効にします。つまり、ユーザーがフォーム変数「hello」を送信した場合、PHP は「$hello」を作成せず、「HTTP_GET/POST_VARS['hello']」のみを作成します。これは PHP では非常に重要なオプションです。このオプションをオフにすると、プログラミングに大きな不便が生じます。
*** 「safe_mode」を「on」に設定します
このオプションをオンにすると、次の制限が追加されます:
1. 実行できるコマンドを制限する
2. 使用できる機能を制限する
3. スクリプトの所有権とターゲットファイルの所有権に基づくファイルアクセス制限
4. ファイルアップロード機能を無効にする
これは ISP にとって「素晴らしい」オプションであり、PHP のセキュリティも大幅に向上します。
** 「open_basedir」を設定します
このオプションを使用すると、指定されたディレクトリ外でのファイル操作を禁止でき、include() によるローカル ファイルまたはリモート ファイルへの攻撃を効果的に排除できますが、ファイル アップロードやセッション ファイルへの攻撃には依然として注意する必要があります。
** 「display_errors」を「off」に設定し、「log_errors」を「on」に設定します
このオプションを使用すると、エラー メッセージが Web ページに表示されなくなり、代わりにログ ファイルに記録されます。これにより、攻撃者がターゲット スクリプト内の関数を検出するのを効果的に防ぐことができます。
* 「allow_url_fopen」を「オフ」に設定します
このオプションはリモート ファイル機能を無効にします。
http://www.bkjia.com/PHPjc/629796.htmlwww.bkjia.com本当http://www.bkjia.com/PHPjc/629796.html技術記事セッションファイルを介して攻撃するにはどうすればよいですか? PHP 4 以降のバージョンはセッションのサポートを提供します。セッションの主な機能は、PHP プログラムのページ間の状態情報を保存することです。たとえば、こんなときは…