PHP を CGI バイナリとして使用するのは、PHP を モジュールとして(Apache のような)サーバーソフトウエアに組み込み たくない何らかの理由がある場合や安全な chroot と setuid 環境をス クリプトに提供する他の CGI ラッパーと組み合わせて PHP を使用する 場合の設定オプションです。セットアップ時には、通常、 php 実行バイ ナリを Web サーバーの cgi-bin ディレクトリにインストールします。 CERT 勧告 » CA-96.11は、いかなるイ ンタプリタを cgi-bin に置くことにも反対しています。 php バイナリをスタンドアロンのインタプリタとして使用することが できる場合でも、PHP は、セットアップにより生じる可能性がある 次のような攻撃を防ぐように設計されています。
?
)
の後のクエリー情報は、CGI インターフェー
スにより、インタプリタにコマンドライン引数として渡されます。通
常、インタプリタは、コマンドライン上の最初の引数に指定されたファ
イルを開き、実行します。
CGI バイナリとして実行された場合、php は、
コマンドライン引数の解釈を拒否します。
Action
)
が使用されます。この設定により、Web サーバーは、まずディレクトリ
/secret へのアクセス権をチェックし、
リダイレクト要求 http://my.host/cgi-bin/php/secret/script.php
を生成します。残念なことに、リクエストが最初からこの形式で与え
られた場合、Web サーバーによるアクセスチェックは、
/secret/script.php ファイル
ではなく、/cgi-bin/php ファイル
に対して行われます。この手法により、/cgi-bin/php にアクセス可能なユーザーは、
Web サーバー上の全ての保護されたドキュメントにアクセスできてし
まいます。
PHP では、サーバードキュメントツリーにアクセス制限付きのディレ
クトリがある場合、設定ディレクティブ cgi.force_redirect、
doc_root および
user_dir をこの攻撃を防止す
るために使用することができます。 これらを組み合わせたいくつか
の手法について以下に詳細な説明を示します。