MD5碰撞
经典例题:[NISACTF 2022]level-up
一、定义
- md5是一种加密算法,并且
不能防止碰撞破解。 - md5加密是不可逆的,这就意味着有两串不同的字符串加密出来的内容却是相同的
- 加密过程简单,碰撞还原字符难
二、PHP弱比较
弱比较还要区分与字符串类型比较还是与int类型比较
eg.
1 | var_dump("123a"==123) |
对于上述结果为
1 | True |
1.字符串与int类型比较:
PHP规定当进行字符串与数字的弱比较时,会进行如下步骤:
先看字符串开头是否为数字,如果为数字,则截止到连续数字的最后一个数字,即"123abc456"=>123
如果开头不为数字,则判断为false,即0。
2.字符串与字符串比较:
因为这个是字符串之间进行比较,想要绕过这个弱比较只能用0e的方式。
在PHP中"0e"判断为科学计数法,0e123就是0的10123次方
不难推出:0e123456789==0e1 // 因为0的任意次方都为0
不过有一个注意点:
1 | "0e123456"=="0e345" //True |
eg.
1 | <?php |
这里列举一些字符串不同开头为0e,哈希值为0e开头的例子:
1 | 0e215962017 0e291242476940776845150308577824 |
三、MD5强比较
以[NISACTF 2022]level-up的level-2为例:
1 | <?php |
- 题目要求POST传入array1和array2,且array1、array2是md5强碰撞(即array1、array2不等但他们的md5散列值完全相等)两串不一样的字符,加密结果却相同:
1 | array1=psycho%0A%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00W%ADZ%AF%3C%8A%13V%B5%96%18m%A5%EA2%81_%FB%D9%24%22%2F%8F%D4D%A27vX%B8%08%D7m%2C%E0%D4LR%D7%FBo%10t%19%02%82%7D%7B%2B%9Bt%05%FFl%AE%8DE%F4%1F%84%3C%AE%01%0F%9B%12%D4%81%A5J%F9H%0FyE%2A%DC%2B%B1%B4%0F%DEcC%40%DA29%8B%C3%00%7F%8B_h%C6%D3%8Bd8%AF%85%7C%14w%06%C2%3AC%BC%0C%1B%FD%BB%98%CE%16%CE%B7%B6%3A%F3%99%B59%F9%FF%C2&array2=psycho%0A%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00W%ADZ%AF%3C%8A%13V%B5%96%18m%A5%EA2%81_%FB%D9%A4%22%2F%8F%D4D%A27vX%B8%08%D7m%2C%E0%D4LR%D7%FBo%10t%19%02%02%7E%7B%2B%9Bt%05%FFl%AE%8DE%F4%1F%04%3C%AE%01%0F%9B%12%D4%81%A5J%F9H%0FyE%2A%DC%2B%B1%B4%0F%DEc%C3%40%DA29%8B%C3%00%7F%8B_h%C6%D3%8Bd8%AF%85%7C%14w%06%C2%3AC%3C%0C%1B%FD%BB%98%CE%16%CE%B7%B6%3A%F3%9959%F9%FF%C2 |
再给一组:
1 | $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%02%A8%28K%F3n%8EKU%B3_Bu%93%D8Igm%A0%D1%D5%5D%83%60%FB_%07%FE%A2 |
上述题目由于有对数组转换为字符串的强制过滤,所以不能使用数组绕过QAQ
数组绕过eg
1 | <?php |
1 | md5_1[]=1&md5_2[]=2 |
原理:PHP对无法md5加密的东西不加密,结果为NULL,虽然会报错,但是null=null,逻辑关系为True。
Leave a comment