PHP は、URL のインポートとステートメントの実行を許可していることでよく批判されます。実際、これは、リモート URL インクルード脆弱性と呼ばれる PHP アプリケーションの脆弱性の最も重要な原因の 1 つであるため、それほど驚くべきことではありません。
このため、多くのセキュリティ研究者は、php.ini 設定でのallow_url_fopen へのポイントを無効にすることを推奨しています。残念ながら、このアプローチを推奨する人の多くは、このアプローチが多くのアプリケーションを破壊する可能性があり、リモート URL のインクルードとそれによってもたらされるセキュリティ上の不安を 100% 保証するものではないことを認識していません。
多くの場合、ユーザーは、PHP で URL の組み込みの無効化を許可するように要求し、他のファイル システム関数を使用するときに宣言のサポートを要求します。
このため、allow_url_include は PHP6 で利用可能になる予定です。これらの議論の後、これらの機能は php5.2.0 にバックポートされました。現在、ほとんどのセキュリティ研究者はアドバイスを変更し、allow_url_include を無効にすることのみを人々にアドバイスしています。
残念ながら、allow_url_fopen とallow_url_include は問題の原因ではありません。一方で、攻撃者はセッションデータ、ファイルアップロード、ログファイルなどを通じて PHP コードを入手することが多いため、アプリケーションにローカル ファイルを含めることは依然として十分に危険です。
一方、allow_url_fopen とallow_url_include は、URL としてマークされた URL ハンドルのみを保護します。これは http(s) と ftp(s) に影響しますが、php や date (php5.2.0 の新機能) の URL には影響しません。 PHP コードインジェクションは非常に簡単に実行できます。
例 1: php://input を使用して POST データを読み取る
<?php // Insecure Include // The following Include statement will // include and execute everything POSTed // to the server include "php://input"; ?> |
// POST されたすべてをインクルードして実行します
// サーバーへ<?php // Insecure Include // The following Include statement will // include and execute the base64 encoded // payload. Here this is just phpinfo() include "data:;base64,PD9waHAgcGhwaW5mbygpOz8+"; ?> |
例 2: データの使用: 任意のコードを含める
// 安全でない Include // 次の Include ステートメントは // Base64 をインクルードして実行しますエンコードされた // ペイロード。ここでは phpinfo() include "data:;base64,PD9waHAgcGhwaW5mbygpOz8+" ?> | ;