PHP 开发团队很高兴地宣布 PHP 5.4.2 现已发布。此版本提供了一个安全修复。
某些基于 CGI 的设置中存在一个漏洞,该漏洞至少被忽视了 8 年。 CGI 规范的第 7 节 指出
某些系统支持一种向 CGI 脚本提供字符串数组的方法。这仅在“索引”查询的情况下使用。这由不包含任何未编码“=”字符的 URL 搜索字符串的“GET”或“HEAD”HTTP 请求识别。因此,在某些 CGI 实现中,不包含查询字符串中“=”的请求与包含“=”的请求的处理方式不同。对于 PHP 而言,这意味着包含 ?-s 的请求可能会转储页面的 PHP 源代码,但包含 ?-s&a=1 的请求则没有问题。
大量网站将 PHP 作为 Apache 模块(通过 mod_php)或使用 nginx 下的 php-fpm 运行。这两种设置都不易受此漏洞的影响。直接 shebang 样式的 CGI 似乎也不易受攻击。
如果您使用 Apache mod_cgi 运行 PHP,则可能容易受到攻击。要查看您是否容易受到攻击,只需在任何 URL 的末尾添加 ?-s。如果您看到您的源代码,则表示您容易受到攻击。如果您的网站正常呈现,则表示您没有受到攻击。
更糟糕的是,我们的错误系统中存在一个错误,该错误在对错误报告的评论中将错误报告的私有标志切换为公开,导致此问题在我们在理想情况下测试解决方案之前就公开。
要解决此问题,请更新到 PHP 5.3.12 或 PHP 5.4.2。我们认识到,由于这是一种相当过时的运行 PHP 的方式,因此可能无法将这些站点升级到现代版本的 PHP,因此另一种方法是配置您的 Web 服务器,不允许这些以“ -”开头且不包含“=”的查询字符串类型的请求通过。添加这样的规则不应破坏任何站点。对于使用 mod_rewrite 的 Apache,它看起来像这样
RewriteCond %{QUERY_STRING} ^(%2d|-)[^=]+$ [NC] RewriteRule ^(.*) $1? [L]
如果您正在编写自己的规则,请务必考虑 urlencoded ?%2ds 版本。
有关 PHP 5.4.2 的源代码下载,请访问我们的 下载页面,Windows 二进制文件可在 windows.php.net/download/ 上找到。 变更日志 已经存在。