第一题:
这是源码。
可以看到这里要求password只能传入字母和数字,而后面的strpos语句又要求password里面必须含有“--”才能输出flag里面的值,很明显这是矛盾的。要绕过判断就利用了ereg函数的%00截断漏洞。当输入的值中含有%00的时候,%00以及后面的字符会被函数忽略。所以输入a%00--就能获取flag。
第二题:
这块代码看着很长,实际分为三部分,$a、$b、$c能被成功赋值就能获取正确结果。
第一个:
switch语句中,$x1被赋值1或0就能使得$a被赋值,而1又被条件判断语句排除,所以简单赋值0就行了。
第二个:
输入的x2会被以json格式解码再以array类型赋给x2,所以输入要符合json格式。后面两句的意思是x21不能是纯数字,但又必须大于2017,很明显要利用PHP的弱类型,同样能得到想要的结果。
第三个:
两个if语句要求x22是个array,同时里面只有两个element而且第一个不能为零。array_search语句是把字符串以两个等号的形式分别与x22里面的数据比较,而字符串与整数比较的时候会被转化为0,所以x22中一个element的值为零就行了。element的值不能设置为字符串的内容,因为下面要求不能含有字符串的内容。
总的输入和结果。
第三题:
这道题的pass是未知的,所以没法直接输入准确的值通过判断。这时就利用了strcmp函数的漏洞,只需要输入一个array就像这样?password[]=1就能使判断成立。strcmp函数的参数中,如果含有数组的话,比较是直接成立的。