IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    推荐的nginx+php(fpm-php fastcgi)open_basedir安全设置

    wwek发表于 2015-04-18 16:43:51
    love 0

    0x00 实验目的

    根据文章”PHP绕过open_basedir列目录的研究”通过测试不同的配置验证本文的绕过basedir的方法是否有效,从而安全配置php open_basedir的目的.
    文中后面几个方法都是windwos下采用枚举的方式列出目录,linux下需要做暴力猜解的方式才可以,所以不做测试.

    测试”DirectoryIterator + Glob”方式是否可以绕过open_basedir
    测试webshell工具”菜刀”是否可以绕过open_basedir

    0x01 实验环境

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

    0x02 测试详细

    只在php-fpm.conf中配置

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

    结果

    open_basedir的目录以外不能读,不能写,不过DirectoryIterator + Glob 可以成功列出全盘文件

    当前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

    菜刀不可跨出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手册有下面这段话
    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

    0x03 个人结论

    DirectoryIterator + Glob的方式可以列出php服务器上所有文件,看似没什么危害,实际上对于长期的APT绝对有帮助.
    open_basedir不是想象的那么安全,说不定别人手上有甚至有能读写open_basedir的0day

    0x04 个人推荐的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”

    如果有错误欢迎大家留言斧正,感谢!

    0x05 参考文档

    PHP绕过open_basedir列目录的研究
    open_basedir bypass exploit
    php-fpm.conf 全局配置段
    php.ini HOST PATH配置

    猜您也喜欢:

    nginx + php-fpm fastcgi防止跨站、跨目录的安全设置

    Lnmp一键包中更新php-fpm至php5.3.3

    Linux Bash Shell 寻找PHP(网站)挂马,后门

    nginx的php目录权限控制问题

    PHP5.3.X php-fpm.conf php.ini中文配置笔记
    无觅


沪ICP备19023445号-2号
友情链接