根據文章」PHP繞過open_basedir列目錄的研究」經過測試不一樣的配置驗證本文的繞過basedir的方法是否有效,從而安全配置php open_basedir的目的.
文中後面幾個方法都是windwos下采用枚舉的方式列出目錄,linux下須要作暴力猜解的方式才能夠,因此不作測試.php
測試」DirectoryIterator + Glob」方式是否能夠繞過open_basedir
測試webshell工具」菜刀」是否能夠繞過open_basedirlinux
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.comphp-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」