前言
- 考点:Php语言代码审计和php语言特性及md5爆破
解题步骤
- 1.先看1
-
要求以get方式传参a,b

-
对于a,isset(a)检查a是否被设置(即是否存在且不为NULL),intval($a)表示将a转化为整数,strlen($a)表示检查a字符串长度,要求a字符串长度≤3,但是同时要求a>6000000,可以想到用科学计数法,令a=1e9(即1000000000)大于9且字符串长度为3,满足条件 a=1e9;
-
对于b,要求$b满足md5判断,哈希值后6位为8b184b,编写php程序,利用穷举法找到满足条件的字符串(MD5可爆破)
-
<?php
$b=0;
while(true){
if('8b18b4' === substr(md5($b),–6,6)){
echo $b;
break;
}
$b+=1;
}
?>
- 2.再看2
-
json_decode(),将 JSON 字符串解析为 PHP 变量

-
外层if,因为c中存在m,n两个元素,且存在json_decode(),所以我们猜测$c的格式大概为{"m":xxx,"n":xxx}
- 要求$c为数组(is_array表示$c为数组),$c[“m”]不为数字(!is_numeric(@$c[“m”])表示其不为数字),且$c[“m”]要大于2022,利用PHP弱比较类型可以进行绕过,如令m=2023C,这样进行比较时,PHP进行隐式类型转换“2023C”>2022,满足m不为数字且m>2022,这样可以先构造c={“m”:2023Z,”n”:[[],””]}
-
内层if,要求@$c[“n”]为数组,且$c[“n”]长度为2(count($c[“n”]==2),且 $c[“n”][0] 也为数组,先构造c={“m”:”2023Z”,”n”:[[],0]
- 内层if下还有过滤逻辑,array_search函数用于在数组中搜索指定的值,如果在c[“n”]中成功搜索到DGGJ,则过关,否则终止程序($d = array_search("DGGJ", $c["n"]);),遍历数组,查找值为DGGJ的项,若找到,则终止程序
很明显,二者矛盾
- 内层if下还有过滤逻辑,array_search函数用于在数组中搜索指定的值,如果在c[“n”]中成功搜索到DGGJ,则过关,否则终止程序($d = array_search("DGGJ", $c["n"]);),遍历数组,查找值为DGGJ的项,若找到,则终止程序
-
array_search使用弱比较类型匹配(==),在低版本php中,“DGGJ“=0,所以要求c[“n”]中含有0。
-
所以我们构造c= {“m”:“2023Z”,“n”:[[0,0],0]}

-
- 执行得到flag






