这里会显示出您选择的修订版和当前版本之间的差别。
— |
note:spoony:推荐的nginx-php-fpm-php-fastcgi-open_basedir安全设置 [2017/01/31 18:18] (当前版本) Spoony 创建 |
||
---|---|---|---|
行 1: | 行 1: | ||
+ | ====== 推荐的nginx+php(fpm-php fastcgi)open_basedir安全设置 ====== | ||
+ | <html> | ||
+ | <h1>0x00 实验目的</h1> | ||
+ | <p>根据文章”PHP绕过open_basedir列目录的研究”通过测试不同的配置验证本文的绕过basedir的方法是否有效,从而安全配置php open_basedir的目的.<br> | ||
+ | 文中后面几个方法都是windwos下采用枚举的方式列出目录,linux下需要做暴力猜解的方式才可以,所以不做测试.</p> | ||
+ | <p>测试”DirectoryIterator + Glob”方式是否可以绕过open_basedir<br> | ||
+ | 测试webshell工具”菜刀”是否可以绕过open_basedir</p> | ||
+ | <h1>0x01 实验环境</h1> | ||
+ | <p>nginx + PHP 5.6.7 fastcgi模式, centos7 linux<br> | ||
+ | 目前配置open_basedir有三处地方php-fpm.conf,nginx fastcgi_param,php.ini<br> | ||
+ | 下面逐一测试</p> | ||
+ | <h1>0x02 测试详细</h1> | ||
+ | <h2>只在php-fpm.conf中配置</h2> | ||
+ | <pre class="lang:default decode:true">php_admin_value[open_basedir]=/home/wwwroot/:/proc/:/tmp/</pre> | ||
+ | <h3>结果</h3> | ||
+ | <p>open_basedir的目录以外不能读,不能写,不过DirectoryIterator + Glob 可以成功列出全盘文件</p> | ||
+ | <pre class="lang:default decode:true">当前open_basedir | ||
+ | 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</pre> | ||
+ | <p>菜刀不可跨出basedir</p> | ||
+ | <p> </p> | ||
+ | <h2>只在nginx的fastcgi_param配置</h2> | ||
+ | <pre class="lang:default decode:true"># set php open_basedir | ||
+ | fastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/:/tmp/:/proc/";</pre> | ||
+ | <p>这里的”$document_root”是nginx中的变量,为nginx的每个server里的root目录<br> | ||
+ | 比如server www.iamle.com配置的root目录为/home/wwwroot/www.iamle.com</p> | ||
+ | <p>认真读php手册有下面这段话<br> | ||
+ | PHP配置值通过 php_value 或者 php_flag 设置,并且会覆盖以前的值。<br> | ||
+ | 请注意 disable_functions 或者 disable_classes 在 php.ini 之中定义的值不会被覆盖掉,但是会将新的设置附加在原有值的后面。<br> | ||
+ | 使用 php_admin_value 或者 php_admin_flag 定义的值,不能被 PHP<br> | ||
+ | 代码中的 ini_set() 覆盖。自 5.3.3 起,也可以通过 web 服务器设置<br> | ||
+ | PHP 的设定。也就是nignx中fastcgi_param配置php的配置<br> | ||
+ | php_flag用来专门设置布尔值,如on, off, 1, 0, true, false, yes, no,<br> | ||
+ | 而php_value用来设置所有类型的值</p> | ||
+ | <h3>结果和上面一样</h3> | ||
+ | <p>open_basedir的目录以外不能读,不能写,不过DirectoryIterator + Glob 可以成功列出全盘文件</p> | ||
+ | <p>菜刀不可跨出basedir</p> | ||
+ | <p> </p> | ||
+ | <h2>只在php.ini配置</h2> | ||
+ | <pre class="lang:default decode:true ">[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/</pre> | ||
+ | <p>意思是当HOST=www.iamle.com设置open_basedir,当PATH=/home/wwwroot/www.iamle.com/</p> | ||
+ | <p>设置open_basedir,我测试的时候2个任意设置一个都是有效的</p> | ||
+ | <h3>结果和上面一样</h3> | ||
+ | <p>open_basedir的目录以外不能读,不能写,不过DirectoryIterator + Glob 可以成功列出全盘文件</p> | ||
+ | <p>菜刀不可跨出basedir</p> | ||
+ | <p> </p> | ||
+ | <h1>0x03 个人结论</h1> | ||
+ | <p>DirectoryIterator + Glob的方式可以列出php服务器上所有文件,看似没什么危害,实际上对于长期的APT绝对有帮助.<br> | ||
+ | open_basedir不是想象的那么安全,说不定别人手上有甚至有能读写open_basedir的0day</p> | ||
+ | <h1>0x04 个人推荐的nginx + php(fastcgi fpm-php)(lnmp) open_basedir的配置</h1> | ||
+ | <p>先设置fpm-php中pool池中的总open_basedir这叫顶层设计,有个总限制,比如统一限制到/home/wwwroot/这样的web目录下<br> | ||
+ | 再对nginx中单个server 通过 fastcgi_param PHP_ADMIN_VALUE 设置<br> | ||
+ | 再对php.ini设置 [HOST=XXX] [PATH=XXX]<br> | ||
+ | 三管齐下妈妈再也不用担心我的php open_basedir了(希望吧)<br> | ||
+ | 虽然很啰嗦,但是这样岂不是更放心<br> | ||
+ | 总而言之就是下面的结果,我就是下面这种啰嗦的配置</p> | ||
+ | <p> </p> | ||
+ | <pre class="lang:default decode:true">#在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/</pre> | ||
+ | <p> </p> | ||
+ | <p>测试中还发现这三个地方配置的优先级如下</p> | ||
+ | <p>“php.ini” > “nginx fastcgi fastcgi_param” > “php-fpm.conf”</p> | ||
+ | <p> </p> | ||
+ | <p>如果有错误欢迎大家留言斧正,感谢!</p> | ||
+ | <p> </p> | ||
+ | <h1>0x05 参考文档</h1> | ||
+ | <p><a href="http://drops.wooyun.org/tips/3978">PHP绕过open_basedir列目录的研究</a><br> | ||
+ | <a href="http://zone.wooyun.org/content/11268">open_basedir bypass exploit</a><br> | ||
+ | <a href="http://php.net/manual/zh/install.fpm.configuration.php">php-fpm.conf 全局配置段</a><br> | ||
+ | <a href="http://php.net/manual/zh/ini.sections.php">php.ini HOST PATH配置</a></p> | ||
+ | </html> | ||
+ | |||
+ | [[https://www.iamle.com/archives/1854.html]] |