[BJDCTF2020]Mark loves cat

解题:
进去后查看代码什么都没有,那就用dirsearch扫描一下目录。
发现/.git源码泄露。
使用GIthack把代码下载下来。代码审计
[BJDCTF2020]Mark loves cat_第1张图片
得到源码就审计。
首先 查看flag.php

读取flag内的文件传送给变量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;

分析代码
先包含进去了flag.php

include 'flag.php';

发现了变量覆盖漏洞

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

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

如果 get型flag参数绝对等于变量名并且变量名等不等于flag则
执行 exit($handsome);

foreach($_GET as $x => $y){
    if($_GET['flag'] === $x && $x !== 'flag'){
        exit($handsome);
    }
}

如果不存在get型flag参数并且存在post型flag参数,则执行exit($yds)

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

如果post型flag参数绝对等于flag或者get型flag参数绝对等于flag执行 exit($is)

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

exit也能输出变量
通过分析发现
第一个判断不能用
根据第二个判断get提交参数yds=flag
通过变量覆盖变成$yds=flag
根据第3个判断可以使用get提交s=flag&flag=flag

查看原文:https://blog.csdn.net/qq_43622442/article/details/105925473?utm_medium=distribute.pc_relevant.none-task-blog-OPENSEARCH-1.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-OPENSEARCH-1.nonecase

你可能感兴趣的:([BJDCTF2020]Mark loves cat)