ホームページ >バックエンド開発 >PHPチュートリアル >PHP プログラミングの一般的な脆弱性とコード例、PHP プログラミングの脆弱性の例_PHP チュートリアル
PHP が普及するにつれ、一部のハッカーは PHP プログラムの脆弱性を利用した攻撃を常に行っています。このセクションでは、グローバル変数、リモート ファイル、ファイル アップロード、ライブラリ ファイル、セッション ファイル、データ型、エラーが発生しやすい関数の側面から PHP のセキュリティを分析します。
グローバル変数を介して攻撃するにはどうすればよいですか?
PHP の変数は事前に宣言する必要はなく、初めて使用するときに自動的に作成され、その型はコンテキストに基づいて自動的に決定されます。プログラマの観点から見ると、これは間違いなく非常に便利なアプローチです。変数を作成したら、プログラム内のどこでも使用できます。この機能の結果、プログラマは変数を初期化することがほとんどなくなります。
明らかに、PHP ベースのアプリケーションの main 関数は通常、ユーザー入力 (主にフォーム変数、アップロードされたファイル、Cookie など) を受け入れ、入力データを処理して、結果をクライアントのブラウザーに返します。 PHP コードがユーザー入力にできるだけ簡単にアクセスできるようにするために、PHP は実際にこの入力データをグローバル変数として扱います。
例:
コードをコピーします
一般的な保護方法は、配列 HTTP_GET[] または POST_VARS[] 内の変数をチェックすることです。これは送信方法 (GET または POST) に応じて異なります。 PHP が「track_vars」オプションをオンにして構成されている場合 (これがデフォルトです)、ユーザーが送信した変数はグローバル変数と上記の配列で使用できます。
ただし、PHP にはユーザー入力の処理に使用される 4 つの異なる配列変数があることに言及する価値があります。 HTTP_GET_VARS 配列は GET モードで送信された変数の処理に使用され、HTTP_POST_VARS 配列は POST モードで送信された変数の処理に使用され、HTTP_COOKIE_VARS 配列は Cookie ヘッダーとして送信された変数の処理に使用され、HTTP_POST_FILES 配列 (比較的新しい PHP によって提供される) に使用されます。 )、これはユーザーが変数を送信するための完全にオプションの方法です。ユーザーリクエストは変数をこれら 4 つの配列に簡単に保存できるため、安全な PHP プログラムはこれら 4 つの配列をチェックする必要があります。
リモートファイル経由で攻撃するには?
PHP は、プログラマーが特定の関数を簡単に実装できるようにするための多数の関数を提供する機能豊富な言語です。しかし、セキュリティの観点から見ると、機能が多ければ多いほど、安全に保つことが難しくなり、リモート ファイルはこの問題の好例です:
コードをコピーします
コードは次のとおりです:
上記のスクリプトは、ファイル「$filename」を開こうとしますが、失敗するとエラー メッセージが表示されます。明らかに、「$filename」を指定できれば、このスクリプトを使用してシステム上の任意のファイルを参照できます。ただし、このスクリプトのあまり明らかではない機能は、他の WEB サイトまたは FTP サイトからファイルを読み取ることができることです。実際、PHP のファイル処理関数のほとんどは、リモート ファイルを透過的に処理します。
例:
「$filename」が「http://target/scripts/..%c1%1c../winnt/system32/cmd.exe?/c+dir」と指定されている場合
上記のコードは、実際にはホスト ターゲットの Unicode 脆弱性を悪用して dir コマンドを実行します。これにより、リモート ファイルの include()、require()、include_once()、require_once() のサポートがコンテキストでより興味深いものになります。これらの関数の主な機能は、指定されたファイルの内容を組み込み、PHP コードに従って解釈することです。これらは主にライブラリ ファイルで使用されます。
例:
攻撃コードは、それが配置されているサーバー (つまり、evilhost) 上では独自の PHP プログラムを実行しないことに注意してください。それ以外の場合、攻撃コードは、ターゲット サーバー上で実行されるのではなく、配置されているサーバーを攻撃します。 。
ファイルアップロード経由で攻撃するには?PHP は RFC 1867 に基づいてファイルのアップロードを自動的にサポートします。次の例を見てみましょう: