關於PHP安全配置繞過問題的一些說明

2022-09-23 13:12:07 字數 2088 閱讀 3907

前幾天發布了個漏洞:php safe_mode等安全配置繞過:

這裡有一些有意思的地方,做一些補充說明。

1、這個問題不是個新問題,其實就是我去年在發的"php fastcgi 的遠端利用"這個問題。只是去年的問題場景是遠端利用,需要管理員將其配置在外網。當時這個問題提交php官方,官方認為這是個個人配置錯誤的問題,無需修補。這一點我也承認,但是官方沒有關注到問題本質,實際上這是兩個問題的復合造成的漏洞,乙個是fpm本身不知道發起請求的另一方是否真的是webserver,另乙個是fpm允許通過這個請求傳遞引數修改php.ini中的配置。於是這一次我換了一種場景,也就是在雲平台或者其他共享主機平台中,允許執行客戶提交的指令碼,而這個fcgi雖然是在本機的9000埠,不對外,但是也可以利用此問題繞過原本進行安全限制的safe_mode/open_basedir等限制。

2、disable_functions/disable_classes無法通過此方法進行繞過。這個問題本來想在漏洞提交時候就寫明的,但是修改漏洞後不知到為什麼wooyun沒有審核通過,因此現在的版本中沒有附加這個說明。

在php-fpm.conf中,我們可以看到這樣一段話:

; defining 'disable_functions' or 'disable_classes' will not 

; overwrite previously defined php.ini values, but will append the new value 

; instead.

也就是說,如果你通過fpm進行修改disable_functions/disable_classes的值,是不會覆蓋原有的配置,而只是在原有配置基礎上再disable你所新增的函式或者類。

是不是php預先考慮到了這裡存在安全問題,才會做的限制?實際上並不是這樣。這個和disable_functions/disable_classes的實現方式有關。如果你願意閱讀一下php的源**,會發現在php的實現中,內建函式和內建類其實都是在記憶體中維護了兩個hash列表,存放著函式的位址。在php程序剛開始執行時,就讀取了php.ini的配置。

這時候就會按照disable_functions/disable_classes的配置,去函式和類的hash列表中刪除對應的內容。

zend_api int zend_disable_function(char *function_name, uint function_name_length tsrmls_dc) /*  

disabled_function[0].fname = function_name; 

return zend_register_functions(null, disabled_function, cg(function_table), module_persistent tsrmls_cc);

}因此,如果你後續再用fpm的php_value等方式之類內容去修改disable_functions/disable_classes的值,這時候原有的函式已經被刪除了,無法再進行恢復,因此新來的值只能附加上去,而不是恢復->替代。

3、正如我在1中所說,這個問題的本質是在於「fpm本身不知道發起請求的另一方是否真的是webserver」和「fpm允許通過這個請求傳遞引數修改php.ini中的配置」。因此這其實是乙個架構的問題。由於fcgi守護程序和webserver分離,這是為了架構上增加可伸縮性,方便前端集群和後端php解析集群的分離和擴充套件,這種架構必然存在兩端互不知曉和信任的代價(之前那個memcached其實也是類似的架構和問題)。我在發現漏洞的過程中就思考過,如果php需要修補這個漏洞,要麼只能限制fcgi引數修改php.ini這項功能,或者白名單可以修改的引數。但這是個臨時的方案,而且只能解決乙個問題。另乙個問題也就是「fpm本身不知道發起請求的另一方是否真的是webserver」,最好的解決方法是在fpm中實現對webserver的認證。從而確定請求**是webserver。但是這涉及到修改fastcgi協議,而協議本身也不是php官方可以去干涉的內容。因此這可能就進入了乙個兩難的境地。

於是我把這個問題提交官方後,看到fat提出的修復方法,果不其然也就是這兩種方式。可是這是否真的能起效果?我們拭目以待。

4、關於漏洞中使用到的exp將暫緩公布。由於提交官方後,看起來這一次官方是有修補的意願,因此暫時不會公布使用的exp**。待後續官方公布最終處理方式後再行決定

關於PHP生產環境的安全配置

關閉錯誤顯示 display errors off 配置錯誤日誌 error log var log php error.log 隱藏php版本號 expose php off 關閉自動註冊全域性變數 5.6以後已移除 register globals off 限定php訪問路徑 open base...

關於PHP配置的範圍問題

這些模式決定著乙個 php 的指令在何時何地,是否能夠被設定。手冊中的每個指令都有其所屬的模式。例如有些指令可以在 php 指令碼中用 ini set 來設定,而有些則只能在 php.ini 或 httpd.conf 中。例如 output buffering 指令是屬於 php ini perdi...

關於Jmeter5 3啟動一閃而過問題

檢查過系統環境配置都沒有問題,但是在啟動jmeter5.3的時候出現系統一閃即關閉的問題。其中看到一篇文章說可以在jmeter.bat的最後新增pause可以讓jmeter啟動停止 於是我新增了pause進行強制停止在啟動命令頁面,之後再次執行jmeter.bat,開啟如下介面,按任意鍵後依然不能開...