.php でない拡張子でも PHP が実行されてしまう可能性がある問題

Apache の問題だと思われますが、PHP で最も影響がありそうです。
Full-disclosure で以下のような投稿がありました。

例えば、サーバ上に test.php.rar という PHP のコードが書かれたファイルが存在していて、http://www.example.com/test.php.rar のようにアクセスされた場合、ダウンロードされるのではなく、PHP のコードが実行されてしまうという指摘です。Apache 1.3.34 と Apache 2.0.55 でも確認できました。

ファイルアップロードを受け付けるスクリプトで、ファイル名をそのまま保存する場合に、危険性があることが指摘されています。以下の全てに該当する場合は危険です。

  1. ファイルアップロードを受け付けている
  2. ファイルアップロード時に指定されたファイル名のまま保存している
  3. そのファイルに直接アクセスを許可している

この問題の対処方法としては、ファイルアップロードのファイル保存時にタイムスタンプや sha1() などのハッシュ関数などにより、ファイル名を変更する方法が挙げられています。


test.cgi.a という以下の内容のファイルを作成して実行権限を付加し、http://localhost/test.cgi.a という形でアクセスしても以下の Perl スクリプトが実行されてしまいましたので、PHP の問題という訳ではなく、Apache 側の問題のようです。

#!/usr/bin/perl

print "Content-type: text/html\n\n";
print "test";

少し調べたところでは、Apache の設定ディレクトリの mime.types に載っていない拡張子で終わっている場合にこの問題が発生するようです。

通常、CGI は実行権限が必要ですが、PHPApache モジュールで実行されている場合は実行権限が不要なため、拡張子を偽って PHP スクリプトをアップロードされた場合に攻撃が成功してしまう可能性が高いと考えられます。

追記(2005.12.07)

既にいろいろなところで指摘されていましたが、この挙動は Apache の仕様のようです。