[BJDCTF2020]Mark loves cat(.git源码泄露与代码审计之变量覆盖漏洞)

知识点:

  • 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

第四种还没想到…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值