[BJDCTF2020] Mark loves cat

发布于 2021-08-06  55 次阅读


知识点

foreach:为数组循环赋值

解题

打开题目,页面十分很复杂,没有可用的功能点,查看网页源代码和数据包,也没有发现任何可疑的地方。

尝试扫描目录,发现git源码泄露

利用GitHacker得到index.php的源代码

<?php

include 'flag.php';

$yds = "dog";
$is = "cat";
$handsome = 'yds'; #对三个变量直接赋值

foreach($_POST as $x => $y){ #将POST传参的建和值给X和y,并且对$$x赋值
$$x = $y;
}

foreach($_GET as $x => $y){ #同理将GET的建和值给X和Y,并且赋值
$$x = $$y;
}

foreach($_GET as $x => $y){ #这里将GET的建和值给X和Y
if($_GET['flag'] === $x && $x !== 'flag'){#GET的值绝对等于$X,$x 本身不等于‘flag’
exit($handsome); #这里明显是经过赋值$X就是flag,然后又不等于,所以此处没有作用
}
}

if(!isset($_GET['flag']) && !isset($_POST['flag'])){ #这里要两处值为空,返回$yds
exit($yds);
}

if($_POST['flag'] === 'flag' || $_GET['flag'] === 'flag'){ #此处要两种传参值任意一个为flag,输出$is的值
exit($is);
}

echo "the flag is: ".$flag;

根据分析,三个if第一个完全不能用

第二个if:要两处都传入的键值均为flag,且为空,要想得到flag,还需要$yds=$flag;

GET: ?yds=flag

经过赋值$yds=$flag,exit()直接输出flag的值

第三个if:此处要两种传参值任意一个为flag,输出$is的值

GET的建和值都是flag

GET: ?is=flag&flag=flag