MD5 绕过的一些思路
常用的0e绕过
0e开头的字符串在参与比较时,会被当做科学计数法,结果转换为0
- QNKCDZO
- 240610708
- s878926199a
- s155964671a
- s214587387a
- s214587387a
- s1091221200a
- byGcY
- sonZ7y
- aabg7XSs
- aabC9RqS
这些字符串的 md5 值都是 0e 开头,在 php 弱类型比较中判断为相等
数组绕过
md5不能加密数组,传入数组会报错,但会继续执行并且返回结果为null
比如将两个数组的md5值进行比较
a[]=a&b[]=b
md5(a[]=1) === md5(b[]=1)
由于md5函数无法处理数组,会返回null,所以md5加密后的结果是下面这样
null === null
结果返回true,也就是说数组的md5值进行比较时,结果相等
需要注意的是0e绕过只能绕过弱类型比较(),而数组绕过不只可以绕过弱类型比较,还可以绕过强类型比较(=)
MD5与SQL注入
可以了解一下MySQL中的一些数值比较特征。
-
当数字和字符串比较时,若字符串的数字部分(需要从头开始)和数字是相同的,那么则返回的是true。
select if(1="1a","相等","不相等") as test;
if(exp1,stat1,stat2):类似于高级语言中三元运算符。当exp1为true的是否返回stat1,为false返回stat2
-
以数字开头的字符串,若开头的字符不是0,那么在做逻辑运算的时候返回的是1,也就是true。
select * from user where password =''or'1234a';
md5($password,true)的漏洞
select * from usera where username = 'admin' and password = md5($pass,true)
对特殊的字符串进行md5后能够与 "or"加上一个非0的字符就可以绕过
ffifdyop
ffifdyop的MD5加密结果是 276f722736c95d99e921722cf9ed621c
经过MySQL编码后会变成’or’6xxx,使SQL恒成立,相当于万能密码,可以绕过md5()函数的加密