MD5是一种散列函数,是哈希算法的一种,可以将任意长度的输入,通过散列算法变换成128位的散列值
MD5加密有4种绕过方式
0e开头的字符串在参与比较时,会被当做科学计数法,结果转换为0
比如将两个md5值进行弱类型比较
md5('QNKCDZO') == md5(240610708)
MD5加密后会变成这个样子
0e830400451993494058024219903391 == 0e462097431906509019562988736854
由于0e开头的字符串会转换为0,所以真正比较的过程会变成下面这样
0 == 0
返回结果为true,也就是说0e开头的md5值进行弱类型比较时,结果相等
常用的MD5加密后以0E开头的有
QNKCDZO
240610708
byGcY
sonZ7y
aabg7XSs
aabC9RqS
s878926199a
s155964671a
s214587387a
s1091221200a
md5不能加密数组,传入数组会报错,但会继续执行并且返回结果为null
比如将两个数组的md5值进行比较
md5(a[]=1) === md5(b[]=1)
由于md5函数无法处理数组,会返回null,所以md5加密后的结果是下面这样
null === null
结果返回true,也就是说数组的md5值进行比较时,结果相等
需要注意的是0e绕过只能绕过弱类型比较(==),而数组绕过不只可以绕过弱类型比较,还可以绕过强类型比较(===)
弱类型比较(==),只判断内容是否相等,如果是字符串类型,则转换成数值型后进行判断
强类型比较(===),判断内容的基础上,还会判断类型是否相同
MD5碰撞也叫哈希碰撞,是指两个不同内容的输入,经过散列算法后,得到相同的输出,也就是两个不同的值的散列值相同
ffifdyop 的MD5加密结果是 276f722736c95d99e921722cf9ed621c
经过MySQL编码后会变成'or'6xxx,使SQL恒成立,相当于万能密码,可以绕过md5()函数的加密