MD5碰撞&php弱类型比较

MD5

参考 https://zhuanlan.zhihu.com/p/131283811
md5 是一种被广泛使用的密码散列函数,可以产生一个 128 位的(16 进制)散列值,2004 年,我国中科院院士王小云证实 md5 算法无法防止碰撞,因此,不适用于安全性认证。

MD5 碰撞

参考 http://t.csdn.cn/jh9ny
常见的碰撞法:暴力碰撞(穷举法、字典法)

  1. 穷举法
    穷举法就是不停地尝试各种字符的排列组合,看哪一个组合的 MD5 码能对上。缺点是太耗费时间。举个例子,假设我们要破解一个 6 位大小写字母和数字混合的密码,那么一共有 (26 + 26 + 10) ^ 6 种组合。这个数的大小超过 500 亿。
  2. 字典法
    字典法就是把计算结果以映射表的形式存放起来,一个原文对应着一个 MD5 值。将已知的 MD5 码查表,就可直接反查出原文。字典法体现了算法设计的 “以空间换时间” 的思想。缺点是比较耗费空间,而且实际上还是要穷举一遍所有的输入,只不过把穷举的结果存了起来。

MD5 碰撞 & php 弱类型比较

参考 https://qing3feng.github.io/2022/08/23/MD5 碰撞 /

php 弱类型比较

弱类型比较 (), 只判断内容是否相等,如果是字符串类型,则转换成数值型后进行判断
强类型比较 (
=), 判断内容的基础上,还会判断类型是否相同

  • string&&int
  • string&&string
    在 PHP 中”0e” 判断为科学计数法,0e123 就是 0 的 10123 次方
1
2
3
4
5
6
7
"0e123456"=="0e345"  //True
"0e12adfc"=="0e345" //False

在0e后面不能含有字母!!!
在0e后面不能含有字母!!!
在0e后面不能含有字母!!!
否则判断为False

MD5 碰撞 & php 弱比较

  1. md5(a)==md5(a)==md5(b) & $a != $b
    加密前不同,加密后相同,== 若比较,可以利用 0e 开头的形式
    常用的 MD5 加密后以 0E 开头的有
1
2
3
4
5
6
7
8
9
10
QNKCDZO
240610708
byGcY
sonZ7y
aabg7XSs
aabC9RqS
s878926199a
s155964671a
s214587387a
s1091221200a
  1. a==md5(a==md5(a)
    加密前和加密后弱比较相同,前后都得是 0e 开头的形式
1
2
3
4
5
0e215962017 0e291242476940776845150308577824
0e1284838308 0e708279691820928818722257405159
0e1137126905 0e291659922323405260514745084877
0e807097110 0e318093639164485566453180786895
0e730083352 0e870635875304277170259950255928

MD5 碰撞 & php 强比较

  • md5(a)===md5(a)===md5(b) & $a != $b
  1. 数组绕过
    md5 不能加密数组,传入数组会报错,但会继续执行并且返回结果为 null
    md5(a[]=1) === md5(b[]=1)
    null === null

MD5-SQL 注入

ffifdyop 的 MD5 加密结果是 276f722736c95d99e921722cf9ed621c
经过 MySQL 编码 (url) 后会变成’or’6xxx, 使 SQL 恒成立,相当于万能密码,可以绕过 md5 () 函数的加密

访问量 访客