0x00 预备知识
关于open_badir
open_badir是php.ini中的一个配置选项
它可将用户访问文件的活动范围限制在指定的区域,
假设open_badir=/home/wwwroot/home/web1/:/tmp/,那么通过web1访问服务器的用户就无法获取服务器上除了/home/wwwroot/home/web1/和/tmp/这两个目录以外的文件。
注意用open_badir指定的限制实际上是前缀,而不是目录名。
举例来说: 若”open_badir = /dir/ur”, 那么目录 “/dir/ur” 和 “/dir/ur1″都是可以访问的。所以如果要将访问限制在仅为指定的目录,请用斜线结束路径名。
关于符号链接
符号链接又叫软链接,是一类特殊的文件,这个文件包含了另一个文件的路径名(绝对路径或者相对路径)。
路有关坚持的作文径可以是任意文件或目录,可以链接不同文件系统的文件。在对符号文件进行读或写操作的时候,系统会自动把该操作转换为对源文件的操作,但删除链接文件时,系统仅仅删除链接文件,而不删除源文件本身。
0x01 命令执行函数
由于open_badir的设置对system等命令执行函数是无效的,所以我们可以使用命令执行函数来访问限制目录。
我们首先创建一个目录
/home/puret/test/
且在该目录下新建一个1.txt 内容为abc
nano 1.三级风txt
再在该目录下创建一个目录命名为b
mkdir b
并且在该目录下创建一个1.php文件内容为
<?php echo file_get_contents("../1.txt");?>
且在php.ini中设置好我们的open_badir
open_badir = /home/puret/test/b/
我们尝试执行1.php看看open_badir是否会限制我们的访问
执行效果如图
很明显我们无法直接读取open_badir所规定以外的目录文件。
接下来我们用system函数尝试绕open_badir的限制来删除1.txt
编辑1.php为
<?php system("rm -rf ../1.txt");?>
先来看看执行1.php之前的文件情况
执行1.php之后
成功通过命令执行函数绕过open_badir来删除文件。
由于命令执行函数一般都会被限制在disable_function当中,所以我们需要寻找其他的途径来绕过限制。
0x02 symlink()函数
我们先来了解一下symlink函数
bool symlink ( string $target , string $link )
symlink函数将建立一个指向target的名为link的符号链接,当然一般情况下这个target是受限于open_badir的。
由于早期的symlink不支持windows,我的测试环境就放在linu我有这样一个朋友x下了。
测试的php版本是5.3.0,其他的版本大家自测吧。
在linux环境下我们可以通过symlink完成一些逻辑上的绕过导致可以跨目录操作文件。
我们首先在/var/www/html/1.php中 编辑1.php的内容为
<?php mkdir("c"); chdir("c"); mkdir("d"); chdir("d"); chdir(".."); chdir(".."); symlink("c/d","tmplink"); symlink("tmpl转矩公式ink/../../1.txt","exploit"); unlink("tmplink"); mkdir("tmplink"); echo file_put_contents("http://127.0.0.1/exploit");?>
接着在/var/www/中新建一个1.txt文件内容为
“abc”
再来设置一下我们的open_badir
open_badir = /var/www/html/
在html目录下编辑一个php脚本检验一下open_badir
<?php file_get_contents("../1.txt");?>
执行看下多年父子成兄弟阅读答案。
意料之中,文件无法访问。
我们执行刚才写好的脚本,1.php
可以看到成功读取到了1.txt的文件内容,逃脱了open_badir的限制
问题的关键就在于
symlink(“tmplink/../../1.txt”,”exploit”);
此时tmplink还是一个符号链接文件,它指向的路径是c/d,因此exploit指向的路径就变成了
c/d/../../1.txt
由于这个路径在open_badir的范围之内所以exploit成功建立了。
之后我们删除tmplink符号链接文件再新建一个同名为tmplink的文件夹,这时exploit所指向的路径为
tmplink/../../
由于这时候tmplink变成了一个真实存在的文件夹所以tmplink/../../变成了1.txt所在的目录即/var/www/
然后再通过访问符号链接文件exploit即可直接读取到1.txt的文件内容
当然,针对symlink()只需要将它放入disable_function即可解决问题,所以我们需要寻求更多的方法。
0x03 glob伪协议
glob是php自5.3.0版本起开始生效的一个用来筛选目录的伪协议,由于它在筛选目录时是不受open_badir的制约的,所以我们可以利用它来绕过限制,我们新建一个目录在/var/www/下命名为test
并且在/var/www/html/下新建t.php内容为
<?php $a = "glob:///var/www/test/*.txt"; if ( $b = opendir($a) ) { while ( ($file = readdir($b)) !== fal ) { echo "filename:".$file."\n"; } clodir($b); }?>
执行结果如图:
成功躲过open_badir的限制读取到了文件。
本文发布于:2023-04-06 17:31:25,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/88ac7acf95de4cbdc64f925ab8574166.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:PHP绕过open.doc
本文 PDF 下载地址:PHP绕过open.pdf
留言与评论(共有 0 条评论) |