创客百科

姿势共享,有节操无门槛参与的创客百科,创客动力之源 \ (^_^) /

用户工具

站点工具


note:spoony:推荐的nginx-php-fpm-php-fastcgi-open_basedir安全设置

差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

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>&​nbsp;</​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>&​nbsp;</​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>&​nbsp;</​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 通过&​nbsp;​fastcgi_param PHP_ADMIN_VALUE 设置<​br>​
 +再对php.ini设置 [HOST=XXX] [PATH=XXX]<​br>​
 +三管齐下妈妈再也不用担心我的php open_basedir了(希望吧)<​br>​
 +虽然很啰嗦,​但是这样岂不是更放心<​br>​
 +总而言之就是下面的结果,​我就是下面这种啰嗦的配置</​p>​
 +<​p>&​nbsp;</​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>&​nbsp;</​p>​
 +<​p>​测试中还发现这三个地方配置的优先级如下</​p>​
 +<​p>​“php.ini” &gt; “nginx fastcgi fastcgi_param” &gt; “php-fpm.conf”</​p>​
 +<​p>&​nbsp;</​p>​
 +<​p>​如果有错误欢迎大家留言斧正,​感谢!</​p>​
 +<​p>&​nbsp;</​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]]
note/spoony/推荐的nginx-php-fpm-php-fastcgi-open_basedir安全设置.txt · 最后更改: 2017/01/31 18:18 由 Spoony