打开靶场后发现是一段意义不明的字符,根据题目的提示,首先先测试几个常用的备份文件后缀,经验证为index.php.bak(当然,可以用御剑进行扫描),将文件down到本地后进行查看
接下来来逐行分析php代码
①
②
③
④
⑤这是至关重要的一步,我最开始没有解出这道题就是卡在这一步上,首先我不是太理解将URI中的字符串解析成变量的含义,在网上查询了资料之后,我个人认为可以这样理解:
可以将自己在URL中输入的字符串当做变量去执行,比如说下文中的$key1和$key2,如果我们在URL中输入了key1或者key2这样的字符,parse_str()就会将其解析成$key1和$key2放入php代码中去执行
⑥
⑦如果key1和key2的md5值相等且key1和key2本身不相等,就能输出flag
因为在对key1和key2的md5值进行对比时,如果md5值是以0e开头,根据php的特性,php将其认作为0,因此只要key1和key2的md5值都是以0e开头,则条件成立
常见的md5值以0e开头:https://www.cnblogs.com/apolloren/p/14139516.html
在分析完代码后,接下来进行构造payload
初步构造:?key1=QNKCDZO&key2=240610708,发现flag还是没有输出,这时我们要注意到key会被转换为空字符串,需要进行绕过
双写绕过:?kkeyey1=QNKCDZO&kkeyey2=240610708,即可得到flag