easyphp(xctf)

<?php
highlight_file(__FILE__);
$key1 = 0;
$key2 = 0;

$a = $_GET['a'];
$b = $_GET['b'];

if(isset($a) && intval($a) > 6000000 && strlen($a) <= 3){
    if(isset($b) && '8b184b' === substr(md5($b),-6,6)){
        $key1 = 1;
        }else{
            die("Emmm...再想想");
        }
    }else{
    die("Emmm...");
}

$c=(array)json_decode(@$_GET['c']);
if(is_array($c) && !is_numeric(@$c["m"]) && $c["m"] > 2022){
    if(is_array(@$c["n"]) && count($c["n"]) == 2 && is_array($c["n"][0])){
        $d = array_search("DGGJ", $c["n"]);
        $d === false?die("no..."):NULL;
        foreach($c["n"] as $key=>$val){
            $val==="DGGJ"?die("no......"):NULL;
        }
        $key2 = 1;
    }else{
        die("no hack");
    }
}else{
    die("no");
}

if($key1 && $key2){
    include "Hgfks.php";
    echo "You're right"."\n";
    echo $flag;
}

?>

只有当$key1和$key2都=1时,才会显示falg。为了让它们都等于1,一共需要对三个参数进行绕过

参数a

isset($a) && intval($a) > 6000000 && strlen($a) <= 3

判断参数是否为空,并且传入的数据长度不能超过3,值要大于6000000。

可以使用科学计数法来绕过  1e3=100

参数b 

isset($b) && '8b184b' === substr(md5($b),-6,6)

参数b传入的数据被MD5加密后的最后6位必须是8b184b

可以爆破出来,php代码

<?php
$a=0;
while(1)
{
    if(substr(md5($a),-6,6)==='8b184b')
    {
        echo $a;
        break;
    }
    $a++;
}
?>

结果是:
53724

 参数c

$c=(array)json_decode(@$_GET['c']);
if(is_array($c) && !is_numeric(@$c["m"]) && $c["m"] > 2022){
    if(is_array(@$c["n"]) && count($c["n"]) == 2 && is_array($c["n"][0])){
        $d = array_search("DGGJ", $c["n"]);
        $d === false?die("no..."):NULL;
        foreach($c["n"] as $key=>$val){
            $val==="DGGJ"?die("no......"):NULL;

json_decode()接受一个JSON格式的字符串并且把它转换为PHP变量 ,当该参数$assoc为TRUE时,将返回array,否则返回object。

 传入的c必须有m,n两个键名,m的键值不是数字,但是要大于2022。

php中,当字符与数字进行比较时,字符会被转化为数字, 可以构造  "m":2023a。

n的键值是一个数组,数组的长度不能超过2,并且is_array($c["n"][0]) 告诉我们必须是一个二维数组

"n":[[1,2],[1,2]]   ->  $c['n']=[[1,2],[1,2]] , $c['n'][0]=[1,2]

$d = array_search("DGGJ", $c["n"]);
        $d === false?die("no..."):NULL;
        foreach($c["n"] as $key=>$val){
            $val==="DGGJ"?die("no......"):NULL;

array_search() 在数组中搜索要查询的键值,并返回它的键名(没有键名,返回下标)

首先$d不能的flase,那么array_search() 能够搜索带"DGGJ",即数组中有DGGJ

然后在foreach遍历循环中,又不能让$val="DGGJ",即数组中不能又DGGJ

两者互相矛盾

可以从array_search()这里来绕过,array_search()在搜索中,实际上是一个比较的过程

php中数字和字符串进行比较的时后,字符串会被传换位数字,所以在与数字比较的时候,DGGJ会被转换位0,只需要数组中有0即可。

成功返回了0对应的下标。

所以c={"m":2023a,"n"=[[1,2],0]}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值