可能的攻击
将 PHP 作为 CGI 二进制文件使用是为某些原因不想将 PHP 作为模块集成到服务器软件(如 Apache)中或将使用 PHP 与不同类型的 CGI 包装器来为脚本创建安全的 chroot 和 setuid 环境的设置的一种选择。此设置通常涉及将可执行 PHP 二进制文件安装到 Web 服务器 cgi-bin 目录。CERT 建议 » CA-96.11 建议不要将任何解释器放置到 cgi-bin 中。即使 PHP 二进制文件可以用作独立解释器,PHP 旨在防止此设置可能导致的攻击
-
访问系统文件:http://my.host/cgi-bin/php?/etc/passwd 问号 (?) 后的 URL 中的查询信息作为命令行参数由 CGI 接口传递给解释器。通常解释器会打开并执行作为命令行上的第一个参数指定的的文件。 当作为 CGI 二进制文件调用时,PHP 拒绝解释命令行参数。
-
访问服务器上的任何 Web 文档:http://my.host/cgi-bin/php/secret/doc.html PHP 二进制文件名称后的 URL 的路径信息部分,/secret/doc.html 通常用于指定要由 CGI 程序打开和解释的文件的名称。通常使用一些 Web 服务器配置指令(Apache:Action)将对像 http://my.host/secret/script.php 这样的文档的请求重定向到 PHP 解释器。通过此设置,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 可用于防止此攻击,前提是服务器文档树具有任何访问限制的目录。有关不同组合的完整说明,请参见下文。