这道代码审计题我们需要绕过限制让key1,2变量等于1,然后下面即可打印flag
先从第一部分开始,要让a取整的值大于六百万而且长度不能大于3,我们可以使用科学计数法,比如7e6,结果七百万而且长度刚好为3。
第二个if我们b不为空并且截取md5算法后的b的后六位要和'8b184b'强等于,强等于某个字符串不能md5碰撞了,我们写个脚本看看有没有哪个数符合这个条件吧
得出53724符合这个条件,所以?a=7e6&b=53724即可让$key1=1
接下来分析第二部分
$c=(array)json_decode(@$_GET['c'])使得我们传递参数给c需要用json格式,并且强制转换为数组
$c是中键位m的值不能是数字并且值要大于2022,传个字符串2023a即可
count计算数组元素个数,然后就是要让c[n]中存在第一个子元素也为数组,很简单直接嵌套数组即可
根据官方文档
PHP: array_search - Manual array_search函数第三个参数导致如果在数组中找不到"DGGJ"就会将前面的字符串转为布尔值false继续找,
array_search函数又是弱类型比较,所以我们在c["n"]嵌套的数组再加一个0即可绕过,不让他终止程序,c["n"]数组中没有这个字符串循环里面不可能终止程序,然后得到$key2=2
最终payload:?a=7e6&b=53724&c={"m":"2023a","n":[[],0]}
拿下