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的限制。