WP | easyphp 攻防世界 web
1、点击进入题目场景后显示一大段php代码,初步可判断本题的解题方向主要为代码审计
2、仔细浏览一遍源代码,可以大致分为两部分:
(1)第一部分:
a和b的值均已GET请求方式传参,我们的目的是绕过重重判断即if语句让变量key1被赋值1。
先来简单讲一下php语言中这几个函数的含义:
isset(): 检测变量是否设置
intval(): 获取变量的整数值
strlen(): 返回字符串的长度
substr(string,start,length): 返回字符串的一部分
这句语句的含义是变量a长度不大于3并且大于6000000,我们可以通过科学计数法来进行绕过,随机取7e7
要求变量b的md5加密后的值的前六位为 ‘8b184b’ ,可以通过编写php脚本来得出合适的值进行绕过
变量b的值为53724
(2)第二部分:
1、变量c要求是数组并且存在m不为数字且m大于2022
is_numeric(): 检测变量是否为数字或数字字符串
is_array(): 判断是否为数组
2、$c存在数组n并且n的长度为2并且array[n][0]是二维数组
3、在数组n里寻找“DGGJ”,若找到则返回键值;否则返回false
array_search()采取弱类型比较的特点,因为“DGGJ”开头字符串没有数字,所以转化为数字时为0,则意味着我们构造数组n里非零下标也需要元素0,使得0==0成立,从而绕过该函数
构造变量c使用json_decode格式:c={"m":"2023a","n":[[],0]}
得到完整的playload为 ?a=7e7&b=53724&c={"m":"2023a","n":[[],0]}
结合前两部分key1和key2,利用谷歌浏览器插件Hackbar使用get请求方式传参,可最终得到flag
Flag:cyberpeace{a7a194304e5fc5c7725182aff9beee9d}