<?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;
}
?>
我们先看里面有哪些函数吧
intval() 函数用于获取变量的整数值。
isset()函数用于判断参数是否被赋予值,是则返回true
strlen()函数判断参数的字符串长度
substr(1,2,3)函数第一个参数是我们的参数,第二个是从第几位开始,第三个参数是截取几个,结合起来就是从参数中的第n个参数开始截取长度为m的字符串
substr(md5($b),-6,6)所以这个参数的意思就是将b参数md5编码后截取最后6个字符串
这里第一个if语句我们就可以绕过了
我们先get传参个a为字符串小于三长度的并且数值大于600000,我们就可以用1e9来绕过这表示1后面跟9个0也就是1000000000也就可以绕过第一个过滤
第二个get传参b的话意思是将b参数用MD5编码后的后6位与8b184b匹配,如果相同就可以绕过,那么我们用脚本跑出来的就是
b=53724
下面来看第二个语句
也是用get传参一个c但是c是一个数组并且用json_decode编码
is_array($c)这个是判断c是否为数组
!is_numeric(@$c["m"])这个是判断c[m]这个参数不是字符串
$c["m"] > 2022判断这个c["m"]要大于2022
is_array(@$c["n"])判断c["n"]是否为数组意思就是c的这个数组中的c["n"]参数也得是数组
count($c["n"]) == 2判断c["n"]数组的长度是2
is_array($c["n"][0]也是判断是否为数组
array_search("DGGJ", $c["n"]);这个函数遍历c["n"]数组中是否有DGGJ这个字符串有就返回这个字符串,没有就返回false,我们就可以用数组绕过,也就是当这个函数遍历这个数组的时候,这个数组中的一个数值也是一个数组,利用函数检测到不符合类型的数据时就会返回0这个特性就可以绕过了
foreach($c["n"] as $key=>$val)
forEach() 方法用于调用数组的每个元素,并将元素传递给回调函数。
注意: forEach() 对于空数组是不会执行回调函数的。所以我们直接给这个参数c赋值为[[0],0]就可以绕过了
到这里所以函数都看完了我们就可以构造paylod
?a=1e9&b=53724&c={"m":"2023","n":[[0],0]}
得到cyberpeace{265d340c3cc47d2996c1907cac15210b}
有什么错误欢迎大家给予批评指正