if(md5(
key2) && $key1 !== $key2){
echo $flag.”取得flag”;
如果md5加密的值一样而未加密的值不同,就输出flag.
有两种方法绕过:
1,md5()函数无法处理数组,如果传入的为数组,会返回NULL,所以两个数组经过加密后得到的都是NULL,也就是相等的。
http://www.index.php?kekeyy1[]=1&kekeyy2[]=2
这里是加上为了绕过对key替换为空格
2,利用==比较漏洞
如果两个字符经MD5加密后的值为 0exxxxx形式,就会被认为是科学计数法,且表示的是0*10的xxxx次方,还是零,都是相等的。
下列的字符串的MD5值都是0e开头的:
QNKCDZO
240610708
s878926199a
s155964671a
s214587387a
s214587387a
额外的知识点
1、备份文件的扩展名一般为*.swp,*.bak
2、两种比较靠谱的方法:①用御剑扫描;②用源码泄露工具
3、阅读代码,这里有几个函数:
strstr(string,search,before_search):找到search字符串在string中第一次出现的位置,并把后面的字符串输出;before_search如果为true,则返回位置之前的字符串;默认为false;
substr(string,start,length):看参数很容易理解,返回字符串的一部分;
str_replace(find,replace,string,count):在字符串sting中找到字符串find,并把它替换成replace;
parse_str(string,array):把查询字符串解析到变量中;
然后我们可以知道这段代码的意思:代码从?后开始截取到str中,也就是变量后开始截取字符串;然后从位置1开始截到字符串结束;之后把字符串中的kay字段全用‘ ’替代,这个我们可以通过构造"kekeyy"来绕过;最后把key1和key2解析成变量;