buuctf:[BJDCTF2020]Mark loves cat

打开环境,感觉有很多东西,但是也没找到什么特别提示,用dirseach扫扫,看看是否有收获

 

git源码泄露,用githack将源码下载下来

 

 

 

 

 

查看源码

<?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'){    //GET方式传flag只能传一个flag=flag
        exit($handsome);
    }
}

if(!isset($_GET['flag']) && !isset($_POST['flag'])){    //GET和POST其中之一必须传flag
    exit($yds);
}

if($_POST['flag'] === 'flag'  || $_GET['flag'] === 'flag'){    //GET和POST传flag,必须不能是flag=flag
    exit($is);
}

echo "the flag is: ".$flag;

分析一下代码逻辑

forsearch:
post传参和get传参的参数键名和值

首先我们post:$flag=flag

foreach($_POST as $x => $y){ $$x = $y; }

简单好理解一点,我们直接带入第一行后再比较第二行
这样就变成了$$flag = flag

接下来GET:?yds=flag

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

$x为yds,$y为flag,所以$$x表示$yds,$$y也就是$flag,$flag就是真正的flag{XXXXXX}。$$x = $$y,也就是$yds=flag{XXXXXX}。
看源码

只要没有flag参数,就会exit($yds),就可以得到flag了。

posted @ 2021-10-11 20:13  微草wd  阅读(103)  评论(0编辑  收藏  举报