Mark loves cat

扫描目录(但是我用御剑扫不出来) ,然后用.git下载文件

<?php

include 'flag.php';

$yds = "dog";
$is = "cat";
$handsome = 'yds';

foreach($_POST as $x => $y){    //很明显的有变量覆写漏洞   
    $$x = $y  ;
}

foreach($_GET as $x => $y){    //如果传入$x=flag&$y=flag 则$flag=$flag就可以输出结果
    $$x = $$y;
}

foreach($_GET as $x => $y){
    if($_GET['flag'] === $x && $x !== 'flag'){    //传入GET的键名要为flag,然而键名又不能有flag,(直接弃了这个)
        exit($handsome);
    }
}

if(!isset($_GET['flag']) && !isset($_POST['flag'])){   //不存在键名为flag的GET与POST,输出变量$yds
    exit($yds);
}

if($_POST['flag'] === 'flag'  || $_GET['flag'] === 'flag'){   //传入的POST的键名为flag,且GET的键名也为flag,值都为flag,则输出变量$is
    exit($is);
}



echo "the flag is: ".$flag;

分析代码,主要是输入的值符合某个条件时,输出对应的值(之前我还以为要用反序列化)

从这个地方开始有输出,但是要x等于键名,又不等于键名,不存在

foreach($_GET as $x => $y){
    if($_GET['flag'] === $x && $x !== 'flag'){    //传入GET的键名要为flag,然而键名又不能有flag,(直接弃了这个)
        exit($handsome);
    }
}

第二个,不存在键名为flag的GET与POST,输出变量$yds,先留着,好像可以操作

if(!isset($_GET['flag']) && !isset($_POST['flag'])){   //不存在键名为flag的GET与POST,输出变量$yds
    exit($yds);
}

第三个,传入的POST的键名为flag或者GET的键名为flag,值为flag,则输出变量$is

if($_POST['flag'] === 'flag'  || $_GET['flag'] === 'flag'){   //传入的POST的键名为flag,且GET的键名也为flag,值都为flag,则输出变量$is
    exit($is);
}

可见是正确的

二和三只能满足一个,先看看第三个

法一:

?flag=flag&is=flag

 但是is=flag放在POST里就没用了,不知道为什么

 法二:

看下第二个的

?yds=flag

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值