2012年5月3日
某些基於 CGI 的設定中存在一個漏洞(Apache+mod_php 和 nginx+php-fpm 不受影響),該漏洞至少 8 年來一直未被發現。CGI 規範的第 7 節 指出
某些系統支援一種將字串陣列提供給 CGI 腳本的方法。這僅用於「索引」查詢的情況。這可以通過「GET」或「HEAD」HTTP 請求來識別,其 URL 搜尋字串不包含任何未編碼的「=」字元。
因此,在某些 CGI 實作中,查詢字串中不包含「=」的請求與包含「=」的請求的處理方式不同。對於 PHP 而言,這意味著包含 ?-s 的請求可能會洩漏頁面的 PHP 原始碼,但包含 ?-s&=1 的請求則沒問題。
許多網站都通過 mod_php 將 PHP 作為 Apache 模組運行,或在 nginx 下使用 php-fpm 運行。這些設定都不受此漏洞的影響。直接的 shebang 風格的 CGI 似乎也不受影響。
如果您使用 Apache mod_cgi 運行 PHP,則可能容易受到攻擊。要查看您是否容易受到攻擊,只需在任何 URL 的末尾添加 ?-s。如果您看到您的原始碼,則表示您容易受到攻擊。如果您的網站正常顯示,則表示您沒有受到影響。
要修復此問題,請更新至 PHP 5.3.12 或 PHP 5.4.2。
我們認識到,由於 CGI 是一種相當過時的 PHP 運行方式,因此將這些網站升級到現代版本的 PHP 可能不可行。另一種方法是將您的網路伺服器設定為不允許這種類型的請求通過,即查詢字串以「-」開頭且不包含「=」。新增這樣的規則應該不會破壞任何網站。對於使用 mod_rewrite 的 Apache,它看起來像這樣
RewriteCond %{QUERY_STRING} ^(%2d|-)[^=]+$ [NC]
RewriteRule ^(.*) $1? [L]
如果您正在編寫自己的規則,請務必考慮 urlencoded 的 ?%2ds 版本。
更糟的是,我們的錯誤系統中存在一個錯誤,該錯誤在對錯誤報告的評論中將錯誤報告的私有標誌切換為公開,導致此問題在我們有時間對解決方案進行我們想要的級別的測試之前就公開了。請通過 bugs.php.net 報告任何問題。
如需 PHP 5.3.12 和 PHP 5.4.2 的原始碼下載,請造訪我們的 下載頁面,Windows 二進位檔可在 windows.php.net/download/ 上找到。變更日誌 存在。