根据文章”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”