宝哥软件园

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

编辑:宝哥软件园 来源:互联网 时间:2021-08-31

0x00初步知识

在open_basedir上

Open_basedir是php.ini中的一个配置选项

它可以将用户访问文件的活动范围限制在指定的区域,

假设open _ basedir=/home/wwwroot/home/web1/:/tmp/,通过web 1访问服务器的用户除了/home/wwwroot/home/web1/和/tmp/,无法在服务器上获取文件。

请注意,用open_basedir指定的限制实际上是一个前缀,而不是目录名。

例如,如果“open_basedir=/dir/user”,则目录“/dir/user”和“/dir/user1”是可访问的。因此,如果您希望只限制对指定目录的访问,请以斜线结束路径名。

关于符号链接

符号链接,也称为软链接,是一种特殊的文件,它包含另一个文件的路径名(绝对路径或相对路径)。

路径可以是任何文件或目录,不同文件系统的文件可以链接。读取或写入符号文件时,系统会自动将操作转换为对源文件的操作,但删除链接文件时,系统只删除链接文件,而不删除源文件本身。

0x01命令执行功能

由于open_basedir的设置对系统等命令执行功能无效,我们可以使用命令执行功能访问受限目录。

我们首先创建一个目录

/home/puret/test/

并在这个目录中创建一个包含abc内容的新1.txt

nano 1.txt

然后在这个目录下创建一个名为B的目录

mkdir b

并在该目录中创建一个包含以下内容的1.php文件

?php回显文件_get_contents('./1 . txt ');并在php.ini中设置我们的open_basedir

open _ basedir=/home/puret/test/b/

我们尝试执行1.php,看看open_basedir是否会限制我们的访问

执行效果如图所示

显然,除了open_basedir指定的目录文件,我们不能直接读取其他目录文件。

接下来,我们使用系统函数尝试删除open_basedir限制附近的1.txt

编辑1.php是

?php系统(' rm -rf./1 . txt ');让我们看看1.php实施前的文件

1.php实施后

通过命令执行函数绕过open_basedir,文件被成功删除。由于命令执行函数通常被限制为disable_function,因此我们需要找到其他方法来绕过这一限制。

0x02 symlink()函数

让我们先来看看symlink函数

bool符号链接(字符串$target,字符串$link)

symlink函数将创建一个名为link的指向目标的符号链接,该链接通常受open_basedir的限制。由于早期的symlink不支持windows,所以我的测试环境放在了Linux下。

测试的PHP版本是5.3.0。请自己测试其他版本。

在Linux环境下,我们可以通过symlink完成一些逻辑旁路,从而实现跨目录的文件操作。

我们首先编辑1.php的内容如下

?PHP mkdir(' c ');chdir(' c ');mkdir(' d ');chdir(' d ');chdir(' . ');chdir(' . ');symlink('c/d ',' tmplink ');symlink('tmplink/././1.txt ',' exploit ');取消链接(' 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文件_get_contents('./1 . txt ');执行。看看吧。

不出所料,该文件不可访问。

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

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

问题的关键在于

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

此时,tmplink仍然是一个符号链接文件,它指向的路径是c/d,因此漏洞利用指向的路径变为

c/d/././1.txt

由于此路径在open_basedir的范围内,因此成功建立了漏洞利用。

之后,我们删除tmplink符号链接文件,并创建一个与tmplink同名的新文件夹。此时,漏洞利用所指向的路径是

tmplink/././

这时,tmplink变成了一个真正的文件夹,所以tmplink/./成为1.txt所在的目录,即/var/www/

然后,通过访问符号链接文件漏洞,您可以直接读取1.txt的文件内容

当然,symlink()只需要放在disable_function中就可以解决问题,所以我们需要找到更多的方法。

0x03 glob伪协议

Glob是自PHP 5 . 3 . 0版本以来用于过滤目录的伪协议。由于它在过滤目录时不受open_basedir的限制,我们可以使用它来绕过限制。我们在/var/www/

并创建一个新的t.php。内容是

?PHP $ a=' glob :///var/www/test/*。txt ';if($ b=opendir($ a)){ while($ file=readdir($ b))!==false ) { echo 'filename: '。$文件。 n ';} closedir($ b);}?执行结果如下:

文件被成功读取,没有open_basedir的限制。

更多资讯
游戏推荐
更多+