0%

php变量间接引用

[MoeCTF 2022]ezphp

记一次php变量间接引用

题目来源:[MoeCTF 2022]ezphp | NSSCTF

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
<?php

highlight_file('source.txt');
echo "<br><br>";

$flag = 'xxxxxxxx';
$giveme = 'can can need flag!';
$getout = 'No! flag.Try again. Come on!';
if(!isset($_GET['flag']) && !isset($_POST['flag'])){
exit($giveme);
}

if($_POST['flag'] === 'flag' || $_GET['flag'] === 'flag'){
exit($getout);
}

foreach ($_POST as $key => $value) {
$$key = $value;
}

foreach ($_GET as $key => $value) {
$$key = $$value;
}

echo 'the flag is : ' . $flag;

?>

代码审计一下,必须以GET或POST传入一个flag参数,才能绕过第一个exit,如果flag参数的值也同为flag,那会被第二个exit终止,如果flag参数不为flag的话,后面flag的值就会被新的值覆盖掉

分析一下两个foreach循环:形如传参name=xtyy,那么就会使$key=name $value=xtyy

重点在于第二个foreach循环

1
2
3
foreach ($_GET as $key => $value) {
$$key = $$value;
}

这里是变量的间接引用,相当于把$key替换成上面的name,也就会变成$name

也就是说,传入的?name=xtyy就会变成$name=$xtyy的传参,

如果这里传入a=flag,就会把$flag的值储存在变量$a中,后面再让$flag=$a,就可以把flag原本的值拿回来

payload:

1
?a=flag&flag=a

其实这相当于

1
2
3
4
5
6
7
<?php

$a=$flag;

$flag=$a;

?>

当然如果传参:

1
?a=flag&b=a&flag=b

只要能在最后把变量flag的值赋回来,都是可以的

成功的拿到了flag

image