MD5加密漏洞

MD5是一种散列函数,是哈希算法的一种,可以将任意长度的输入,通过散列算法变换成128位的散列值

MD5加密有4种绕过方式

0e绕过
数组绕过
MD5碰撞
MD5SQL注入

0e绕过

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 值都是 0e 开头,在 php 弱类型比较中判断为相等

数组绕过

md5不能加密数组,传入数组会报错,但会继续执行并且返回结果为null

比如将两个数组的md5值进行比较
md5(a[]=1) === md5(b[]=1)

如下代码

var_dump(md5($_GET[‘a’]) == md5($_GET[‘b’]))
传入
a[]=a&b[]=b

由于md5函数无法处理数组,会返回null,所以md5加密后的结果是下面这样
null === null
结果返回true,也就是说数组的md5值进行比较时,结果相等
需要注意的是0e绕过只能绕过弱类型比较(==),而数组绕过不只可以绕过弱类型比较,还可以绕过强类型比较(===)
弱类型比较(==),只判断内容是否相等,如果是字符串类型,则转换成数值型后进行判断
强类型比较(===),判断内容的基础上,还会判断类型是否相同

强类型绕过

if((string)$_POST['a'] !== (string)$_POST['b'] && md5($_POST['a']) === md5($_POST['b']))
[安洵杯 2019]easy_web(buu有环境) 的源码,第一次遇到这个,我直接懵逼
payload:

1
2
3
a=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%00%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%55%5d%83%60%fb%5f%07%fe%a2
&b=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%02%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%d5%5d%83%60%fb%5f%07%fe%a2


进行url解码后的MD5值相等

MD5碰撞

MD5碰撞也叫哈希碰撞,是指两个不同内容的输入,经过散列算法后,得到相同的输出,也就是两个不同的值的散列值相同

MD5-SQL注入

ffifdyop 的MD5加密结果是 276f722736c95d99e921722cf9ed621c

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


本文作者: Alone
本文链接: https://blog.nosecurity.cn/posts/56485.html
版权声明: 本博客所有文章除特别声明外,均为原创,采用 CC BY-SA 4.0 协议 ,转载请注明出处!