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