PHP 日本研討會 2024

PHP 5.3.12 版本發佈公告

PHP 開發團隊很高興宣布 PHP 5.3.12 版本已正式發佈。此版本提供安全性修復。

在某些基於 CGI 的設定中,存在一個至少被忽略了 8 年的漏洞。CGI 規範的第 7 節指出

某些系統支援一種將字串陣列提供給 CGI 腳本的方法。這僅用於「索引」查詢的情況。這由不包含任何未編碼「=」字元的 URL 搜尋字串的「GET」或「HEAD」HTTP 請求識別。

因此,在某些 CGI 實作中,查詢字串中沒有「=」的請求與有「=」的請求處理方式不同。對於 PHP 來說,這意味著包含 ?-s 的請求可能會傾印該頁面的 PHP 原始碼,但包含 ?-s&a=1 的請求則沒問題。

許多網站都將 PHP 作為 mod_php 的 Apache 模組執行,或是在 nginx 下使用 php-fpm 執行。這兩種設定都不會受到此漏洞的影響。直接 shebang 樣式的 CGI 似乎也不會受到影響。

如果您使用 Apache mod_cgi 執行 PHP,您可能會受到影響。若要查看您是否受到影響,只需在任何 URL 的末尾添加 ?-s。如果您看到您的原始碼,則您易受攻擊。如果您的網站正常呈現,則您不會受影響。

更糟的是,我們的錯誤系統中存在一個錯誤,會在錯誤報告的註解中將錯誤報告的私人標誌切換為公開,導致此問題在我們有時間將解決方案測試到我們想要的程度之前就公開了。

若要修復此問題,請更新至 PHP 5.3.12 或 PHP 5.4.2。我們了解到,由於這是一種相當過時的 PHP 執行方式,因此將這些網站升級到現代版本的 PHP 可能並不可行,因此另一種方法是設定您的網頁伺服器,讓這些類型以「-」開頭且不包含「=」的查詢字串請求無法通過。添加類似這樣的規則不應破壞任何網站。對於使用 mod_rewrite 的 Apache,它看起來會像這樣

    RewriteCond %{QUERY_STRING} ^(%2d|-)[^=]+$ [NC]
    RewriteRule ^(.*) $1? [L]

如果您正在編寫自己的規則,請務必考慮到 URL 編碼的 ?%2ds 版本。

有關 PHP 5.3.12 的原始碼下載,請訪問我們的下載頁面,Windows 二進位檔可以在 windows.php.net/download/ 上找到。存在一份變更日誌

To Top