ホームページ >バックエンド開発 >PHPチュートリアル >PHP プログラムの一般的な脆弱性の詳細な説明_PHP チュートリアル
前に説明したように、include() と require() は主にコード ベースをサポートするためのものです。通常、この独立したファイルは、関数を使用する必要がある場合にのみコード ベースとして使用されるためです。このコード ライブラリを現在のファイルに含める必要があります。 当初、PHP プログラムを開発してリリースするとき、コード ベースとメインのプログラム コードを区別するために、コード ベース ファイルに「.inc」拡張子を付けるのが一般的でした。しかし、すぐにこれは間違いであることがわかりました。ファイルを PHP インタープリターで PHP コードに正しく解析できません。このようなファイルをサーバー上で直接リクエストすると、そのファイルのソースコードが取得されます。これは、PHP が Apache モジュールとして使用される場合、PHP インタープリターがファイルの拡張子に基づいて PHP に解析するかどうかを決定するためです。コードの。拡張子はサイト管理者によって指定されます。通常は「.php」、「.php3」、「.php4」です。重要な構成データが適切な拡張子なしで PHP ファイルに含まれている場合、リモート攻撃者がこの情報を簡単に入手できます。 最も簡単な解決策は、ファイルごとに PHP ファイル拡張子を指定することです。これにより、ソース コードの漏洩を十分に防ぐことができますが、攻撃者がこのファイルを要求することにより、コンテキスト内で実行されるコードが独立して動作するようになる可能性があります。前述したすべての攻撃につながる可能性があります。 明らかな例を次に示します: main.php 内: $libDir = "/libdir"; $langDir = "$libdir/言語"; ... include("$libdir/load language.php": ?> libdir/load language.php: ... include("$langDir/$userLang"); ?> 「libdir/load language.php」は「main.php」から呼び出される場合には非常に安全ですが、「libdir/load language」には拡張子が「.php」であるため、リモート攻撃者がこのファイルを直接要求し、任意の値を指定する可能性があります。 「$langDir」と「$userLang」。 [セッションファイル] PHP 4 以降のバージョンはセッションのサポートを提供します。セッションの主な機能は、PHP プログラムのページ間の状態情報を保存することです。たとえば、ユーザーが Web サイトにログインすると、そのユーザーがログインしたという事実と Web サイトに誰がログインしたかがセッションに保存され、ユーザーが Web サイトを閲覧すると、すべての PHP コードがこの状態情報を取得できます。 実際、セッションが開始されると (実際には、最初のリクエストで自動的に開始するように構成ファイルで設定されます)、ランダムな「セッション ID」が生成されます。リモート ブラウザがリクエストの送信時に常に送信する場合、この「セッション ID」を使用すると、セッションは常に維持されます。これは、Cookie を使用するか、各ページでフォーム変数 (「セッション ID」を含む) を送信することで簡単に実現できます。 PHP プログラムはセッションを使用して特別な変数を登録でき、その値は各 PHP スクリプトの終了後にセッション ファイルに保存され、各 PHP スクリプトの開始前にも変数にロードされます。簡単な例を次に示します: session_destroy(); // 現在セッション内のデータをすべて削除します $session_auth = "ショーン"; session_register("session_auth"); // $session_auth をセッション変数として登録します ?> 新しいバージョンの PHP では、「$session_auth」の値が自動的に「shaun」に設定され、将来のスクリプトは変更された値を自動的に受け入れるようになります。これはステートレス Web ツールにとっては非常に良いことですが、注意する必要もあります。 。 明らかな疑問は、変数がセッションから取得されたものであることを確認することです。たとえば、上記のコードの場合、後続のスクリプトは次のようになります。 if (!empty($session_auth)) // ここでサイトへのアクセスを許可します ?> 上記のコードは、「$session_auth」が設定されている場合、ユーザー入力ではなくセッションから設定されていると想定しています。攻撃者がフォーム入力を通じて設定すると、サイトにアクセスできるようになります。攻撃者は、この攻撃方法を使用する前に変数をセッションに登録する必要があることに注意してください。変数がセッションに配置されると、フォーム入力はすべて上書きされます。 セッション データは通常、ファイルに保存されます (場所は設定可能で、通常は「/tmp」)。このファイルには、変数名、変数の種類、変数の値が含まれます。他のデータ。マルチホスト システムでは、ファイルが Web サーバーを実行しているユーザー (通常は誰も) として保存されるため、悪意のあるサイト所有者がセッション ファイルを作成して他のサイトにアクセスしたり、セッション ファイルの機密情報を検査したりする可能性があります。 。 」であることがわかっているため、次の操作を行うだけで済みます。ディレクトリを推測すると、通常は「/tmp」になります。 【データ型】 PHP には緩いデータ型があり、変数の型は変数が検出されるコンテキストによって異なります。例: "$hello" は値 "" を持つ文字列変数として開始されますが、評価されると整数変数 "0" になり、予期しない結果が生じる場合があります。 "$hello" の値が "000" と "0" の間で異なる場合、empty() によって返される結果は true ではありません。 PHP の配列は連想配列です。つまり、配列のインデックスは文字列型です。これは、「$hello["000"]」と「$hello[0]」も異なることを意味します。 たとえば、ある場所で変数が「0」であるかどうかをテストし、別の場所でそれを確認するために empty() を使用するべきではありません。 【エラーが起こりやすい機能】 PHP プログラムの脆弱性を分析する場合、ソース コードが入手できれば、エラーが発生しやすい関数のリストが非常に必要になります。これらの関数のパラメータをリモートで変更できれば、脆弱性が見つかる可能性が高くなります。以下は、エラーが発生しやすい関数の詳細なリストです: eval(): 指定された文字列を PHP コードとして実行します preg_replace(): 「/e」スイッチと一緒に使用すると、置換文字列は PHP コードとして解釈されます <コマンド実行> exec(): 指定されたコマンドを実行し、実行結果の最後の行を返します passthru(): 指定されたコマンドを実行し、すべての結果をクライアントのブラウザーに返します ``: 指定されたコマンドを実行し、すべての結果を配列に返します system(): passthru() と同じですが、バイナリデータを処理しません Popen(): 指定されたコマンドを実行し、入力または出力を PHP ファイル記述子に接続します <ファイル漏洩> fopen(): ファイルを開き、PHP ファイル記述子に対応します readfile(): ファイルの内容を読み取り、クライアントのブラウザに出力します file(): ファイルの内容全体を配列に読み取ります 翻訳者注: 実際、このリストは完全ではありません。たとえば、「mail()」や他のコマンドもコマンドを実行する可能性があるため、自分で追加する必要があります。 【PHPのセキュリティを強化する方法】 上記で紹介したすべての攻撃は、PHP 4 のデフォルトのインストールに対してうまく実装できますが、何度も繰り返していますが、PHP の設定は非常に柔軟であり、いくつかの PHP オプションを設定することで、これらの攻撃の一部に抵抗することは完全に可能です。攻撃します。以下に実装の難易度に応じていくつかの構成を分類しました: ※難易度低め **低から中程度の難易度 ***中~高難易度 ****高難易度 上記の分類はあくまで私の個人的な意見ですが、PHP が提供するものを使用すれば保証できます |