MD5强碰撞
可以看到,使用了三个等号,这个时候PHP会先检查两边的变量类型,如果不相等直接返回False。
数组
param1: aaa[]
param2: bbb[]
param1[]=111¶m2[]=222
这个时候md5读入两个数组的时候,因为无法解析数组内容,都会读入一个常量字符串“array”,故两个参数md5相同。
科学计数法
0e开头的数字会被解析成科学计数法。
1e12 ---> 1 * 10^12
0e开头的意思自然就都会解析成0。
我们只需要找两个字符串,让其md5后开头两个字母是0e即可,如有需要,这两个字符串本身也可以是0e开头。
param1=QNKCDZO¶m2=aabg7XSs
真实碰撞
就是开头题目上的,将post进去的参数转为string类型,没有办法再用数组和科学计数法的方法,所以只能使用真实的碰撞。
a=M%C9h%FF%0E%E3%5C%20%95r%D4w%7Br%15%87%D3o%A7%B2%1B%DCV%B7J%3D%C0x%3E%7B%95%18%AF%BF%A2%00%A8%28K%F3n%8EKU%B3_Bu%93%D8Igm%A0%D1U%5D%83%60%FB_%07%FE%A2&b=M%C9h%FF%0E%E3%5C%20%95r%D4w%7Br%15%87%D3o%A7%B2%1B%DCV%B7J%3D%C0x%3E%7B%95%18%AF%BF%A2%02%A8%28K%F3n%8EKU%B3_Bu%93%D8Igm%A0%D1%D5%5D%83%60%FB_%07%FE%A2
因为存在不可见字符,没办法复制到url,所以采用url编码。这两个字符串只在末尾的地方有一点点差别,最后算出来的md5值是相同的,即真实碰撞。研究了半天不太清楚咋来的,姑且先记着。