[xctf] 江苏工匠杯easyphp

[xctf] 江苏工匠杯easyphp

考点

PHP弱类型

一、题目

image-20221016190911421

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

?> Emmm...

二、WP

​ 分析以下代码,分别有a、b、c三个条件,只要当这三个条件都满足的时候,就会输出Flag,a和b都比较简单,所以说本题的考点为参数c的array_search绕过

1、参数a

​ 代码的大概意思为:将a的值转换为整数,然后需要满足大于6000000 同时长度小于等于 3,我们直接使用科学技术法。

a=6e9

2、参数b

​ 代码含义为:将b的值进行md5加密,当加密后的值后6位为8b184b的时候,就会进行到下一个判断,我们直接使用脚本跑一下,得到的结果为53724

3、参数c

​ 接下来就是本题的重点,搞了好久才研究出来/(ㄒoㄒ)/~~。

①、根据第一行代码可知,传入的c应该是一段JSON的数据,然后解析为数组。

②、首先判断Json中Key为m的Value不能为数字,并且需要大于2022,这个简单只需要利用php的弱类型比较,将m赋值为2023开头的字符串即可,这里将其赋值为2023a

③、然后对key为n的value进行判断,要求n必须为一个数组,并且value的数量必须为2,并且n的第一个value又必须为一个数组。然后有意思的来了,题目要求第一次用array_search搜索的时候,必须在n中含有DGGJ,但是接下来的代码是循环查看数组中是否含有DGGJ,如果含有的话就直接die了。

④、经过参考array_search的官方文档,发现当使用in_array()array_search()函数时,如果strict参数没有设置为true,则in_array()array_search()将使用松散来判断。

这里用代码来演示一下什么是松散判断

$array = ['a',0,1,2,'3'];
var_dump(in_array('abc', $array));	//True,下标为1(查看是否在数组中)
var_dump(array_search('abc', $array));		//搜索abc字符串在数组中出现的第一个下标

在array数组中查找abc,我们可以发现其实数组中并没有abc,但是因为松散判断,匹配到了数字0,其实和var_dump("admin" == 0); //结果true同理

发现此漏洞的话,我们就可以将数组c中的第二个值设置为0,这样会满足array_search()的条件,同时也不存在DGGJ

最终我们的payload为

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

条件,同时也不存在DGGJ

最终我们的payload为

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

image-20221016200521753

posted @ 2022-10-16 20:09  YikJiang  阅读(152)  评论(0)    收藏  举报  来源