PHP漏洞之md5()

本文参考
本文总结一下常见的PHP之一md5()
开始前先补充我们这一课所需要的知识。
PHP’==‘与’= = ='的区别。

PHP‘= =’ 与‘===’的区别,在我们使用= =号是时后的两个变量只要求数值相同例如A=123 B=‘123’当进行判断时A= =B是为真虽然他们的类型并不相同但当我们使用A= = =B进行判断时返回值却为假,因为两个变量的类型并不相同。所以我们把‘= = ’称为弱比较‘= = =’称为强比较具体的绕过方法我们再接下来的例子再进行讲解。

下面我们进入第一种PHP的弱比较

if($_POST['a']!=$_POST['b']&& md5($_POST['a'])==md5($_POST['b'])){
	die("success!");
}

这个代码的意思很简单传入两个变量a,b 他们!= 但他们的md5()值相同才能成功,所以运用弱比较进行绕过,因为PHP在比较hax串时是运用的弱比较,所以当hax串以0e开头的时候,PHP默认为科学计数法即0的任意次方都是0所以使用两个经过md5()加密后的hax串是0e的两个变量即可绕过。下面我给出部分md5()加密后0e开头的值。任选以下的两个即可绕过。

QNKCDZO//原值
0e830400451993494058024219903391//hax
240610708//原值
0e462097431906509019562988736854//hax
s878926199a
0e545993274517709034328855841020
s155964671a
0e342768416822451524974117254469
s214587387a
0e848240448830537924465865611904
s214587387a
0e848240448830537924465865611904
s878926199a
0e545993274517709034328855841020
s1091221200a
0e940624217856561557816327384675
s1885207154a
0e509367213418206700842008763514
s1502113478a
0e861580163291561247404381396064
s1885207154a
0e509367213418206700842008763514
s1836677006a
0e481036490867661113260034900752
s155964671a
0e342768416822451524974117254469
s1184209335a
0e072485820392773389523109082030
s1665632922a
0e731198061491163073197128363787
s1502113478a
0e861580163291561247404381396064
s1836677006a
0e481036490867661113260034900752
s1091221200a
0e940624217856561557816327384675
s155964671a
0e342768416822451524974117254469
s1502113478a
0e861580163291561247404381396064
s155964671a
0e342768416822451524974117254469
s1665632922a
0e731198061491163073197128363787
s155964671a
0e342768416822451524974117254469
s1091221200a
0e940624217856561557816327384675
s1836677006a
0e481036490867661113260034900752
s1885207154a
0e509367213418206700842008763514
s532378020a
0e220463095855511507588041205815
s878926199a
0e545993274517709034328855841020
s1091221200a
0e940624217856561557816327384675
s214587387a
0e848240448830537924465865611904
s1502113478a
0e861580163291561247404381396064
s1091221200a
0e940624217856561557816327384675
s1665632922a
0e731198061491163073197128363787
s1885207154a
0e509367213418206700842008763514
s1836677006a
0e481036490867661113260034900752
s1665632922a
0e731198061491163073197128363787
s878926199a
0e545993274517709034328855841020

第二种 PHP的强比较

if($_POST['a']!==$_POST['b']&& md5($_POST['a'])===md5($_POST['b'])){
	die("success!");
}

这个与第一种不同的原因是“==” 变成“= = =”的区别,此后的md5()比较要进行强制转换,则即使开头是0e也会被强制转换,所以第一种方法就失效了,但是md5()算法有一个漏洞是其不能转化数组,如果输入的变量为数组则会被算法变成null,两个空即是相等。所以强比较可以使用数组进行绕过。所以答案如下

a[]=1 b[]=2

第三种强碰撞

if((string)$_POST['a']!==(string)$_POST['b'] && md5($_POST['a'])===md5($_POST['b'])){
	die("success!");
}

即他刚开始便强制转换成字符串,所以我们也只能输入字符串去满足第一个条件但是如何保证字符串不相同但是他们的hax值是相同的。其实有一种方法是将hax字符串变成ASCII码转化,再写入bin文件中,因为让服务器可读便再进行url编码。这个可以用python脚本实现,不过我并没有学习过python所以我借助工具实现。fastcoll工具可以直接生成两个bin文件直接使用。这个便属于真正的碰撞了,即他们hax虽然不同但是md5()加密后的值却是相同的。附上参考链接真实碰撞

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值