nginx+php(fpm-php fastcgi)open_basedir安全設置

實驗目的

根據文章」PHP繞過open_basedir列目錄的研究」經過測試不一樣的配置驗證本文的繞過basedir的方法是否有效,從而安全配置php open_basedir的目的.
文中後面幾個方法都是windwos下采用枚舉的方式列出目錄,linux下須要作暴力猜解的方式才能夠,因此不作測試.
php

測試」DirectoryIterator + Glob」方式是否能夠繞過open_basedir
測試webshell工具」菜刀」是否能夠繞過open_basedir
linux

實驗環境

nginx + PHP 5.6.7 fastcgi模式, centos7 linux
目前配置open_basedir有三處地方php-fpm.conf,nginx fastcgi_param,php.ini
下面逐一測試
nginx

測試詳細

 只在php-fpm.conf中配置 web

php_admin_value[open_basedir]=/home/wwwroot/:/proc/:/tmp/

結果shell

open_basedir的目錄之外不能讀,不能寫,不過DirectoryIterator + Glob 能夠成功列出全盤文件centos

open_basedir : /home/wwwroot/:/proc/:/tmp/ 
-- DirectoryIterator + Glob --. 
.. 
.autorelabel 
bin 
boot 
dev 
etc 
home 
lib 
lib64 
media 
mnt 
opt 
proc 
root 
run 
sbin 
srv 
sys 
tmp 
usr 
vagrant 
var

    菜刀不可跨出basedir安全

    只在nginx的fastcgi_param配置服務器

# set php open_basedir 
fastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/:/tmp/:/proc/";

 這裏的」$document_root」是nginx中的變量,爲nginx的每一個server裏的root目錄
 好比server www.iamle.com配置的root目錄爲/home/wwwroot/www.iamle.com
php-fpm

 認真讀php手冊有下面這段話
 PHP配置值經過 php_value 或者 php_flag 設置,而且會覆蓋之前的值。
 請注意 disable_functions 或者 disable_classes 在 php.ini 之中定義的值不會被覆蓋掉,可是會將新的設 置附加在原有值的後面。使用 php_admin_value 或者 php_admin_flag 定義的值,不能被 PHP代碼中的 ini_set() 覆蓋。自 5.3.3 起,也能夠經過 web 服務器設置PHP 的設定。也就是nignx中fastcgi_param配置php的配置php_flag用來專門設置布爾值,如on, off, 1, 0, true, false, yes, no,而php_value用來設置全部類型的值
結果和上面同樣open_basedir的目錄之外不能讀,不能寫,不過DirectoryIterator + Glob 能夠成功列出全盤文件
工具

菜刀不可跨出basedir

只在php.ini配置

[HOST=www.iamle.com]
open_basedir=/home/wwwroot/www.iamle.com/:/proc/:/tmp/
[PATH=/home/wwwroot/www.iamle.com/]
open_basedir=/home/wwwroot/www.iamle.com/:/proc/:/tmp/

意思是當HOST=www.iamle.com設置open_basedir,當PATH=/home/wwwroot/www.iamle.com/

設置open_basedir,我測試的時候2個任意設置一個都是有效的

結果和上面同樣

open_basedir的目錄之外不能讀,不能寫,不過DirectoryIterator + Glob 能夠成功列出全盤文件

菜刀不可跨出basedir

我的結論

DirectoryIterator + Glob的方式能夠列出php服務器上全部文件,看似沒什麼危害,實際上對於長期的APT絕對有幫助.

open_basedir不是想象的那麼安全,說不定別人手上有甚至有能讀寫open_basedir的0day

我的推薦的nginx + php(fastcgi fpm-php)(lnmp) open_basedir的配置

先設置fpm-php中pool池中的總open_basedir這叫頂層設計,有個總限制,好比統一限制到/home/wwwroot/這樣的web目錄下再對nginx中單個server 經過 fastcgi_param PHP_ADMIN_VALUE 設置
再對php.ini設置 [HOST=XXX] [PATH=XXX]
三管齊下媽媽不再用擔憂個人php open_basedir了(但願吧)
雖然很囉嗦,可是這樣豈不是更放心

總而言之就是下面的結果,我就是下面這種囉嗦的配置

#在php-fpm.conf對應的pool池中行尾配置
php_admin_value[open_basedir]=/home/wwwroot/:/proc/:/tmp/

#在nginx fastcgi fastcgi_param配置
#這裏用$document_root是一種取巧的方法,也能夠設置絕對路徑
# set php open_basedir
fastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/:/tmp/:/proc/";

#在php.ini行尾配置
[HOST=www.iamle.com]
open_basedir=/home/wwwroot/www.iamle.com/:/proc/:/tmp/
[PATH=/home/wwwroot/www.iamle.com/]
open_basedir=/home/wwwroot/www.iamle.com/:/proc/:/tmp/

測試中還發現這三個地方配置的優先級以下

「php.ini」 > 「nginx fastcgi fastcgi_param」 > 「php-fpm.conf」

相關文章
相關標籤/搜索