V3D4's Blog

安全技术记录/分享/交流

0%

BJDCTF2020-Mark-loves-cat

稍微记录下吧,题目不难,主要是php了解的还是太少

题目知识点:.git泄露,php代码审计,可变变量

首先题目给了一个写的很好看的前端,拉到最底下看到一个dog

一开始也没啥思路,后来扫了下发现有.git源码泄露,主要代码如下

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
30
31
32
33
<?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'){
exit($handsome);
}
}

if(!isset($_GET['flag']) && !isset($_POST['flag'])){
exit($yds);
}

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



echo "the flag is: ".$flag;

来稍微讲讲这段代码吧,自己php也懂得不多,也是一步步调试才看懂的(我太菜了.jpg)

首先是foreach这个函数,这里拿get这段来将吧,post这题其实用不到

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

当这里输入 xxx/?yds=flag 后,括号中的$x为yds,$y为flag;然后里面的$$x表示$yds,$$y表示$flag,这个时候就把flag的值赋给了yds

这就是所谓的可变变量,就是把一个变量的值变为另一个变量的名字

这题只要输入这个就出结果了,因为下面的三个exit中,只会执行这一段

1
2
3
if(!isset($_GET['flag']) && !isset($_POST['flag'])){
exit($yds);
}

因为我们传入的get参数中没有flag,也没post传入任何参数,所以就直接带着$yds退出了,而yds中之前就保存了flag的值,到这里也就出结果了

最后附上一些调试截图方便理解

执行完get的foreach,此时yds变量已经变成了flag的值

不会执行其他的exit因为都不满足条件,此时就会带着yds,也就是flag的值退出