文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

PHP md5()函数详解,PHP计算MD5,md5()绕过,md5()漏洞原理剖析

2023-09-25 20:40

关注

「作者主页」:士别三日wyx
「作者简介」:CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者
「推荐专栏」:对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》

md5

md5() 可以计算字符串的「MD5散列值」

语法

string md5( $str, raw)

参数

返回值

计算成功,就返回MD5值;计算失败,就返回false。

1、基础使用

平时使用最多的就是「计算MD5」

实例:

echo md5('hello');

输出:

5d41402abc4b2a76b9719d911017c592

2、输出格式

raw 参数控制输出的「格式」

如果你在项目中遇到MD5「加密结果不一致」的问题,可以观察两个加密结果的长度是否相同,比如一个结果是16位,而另一个结果是32位,这种情况就可以考虑更换输出格式来解决。

实例:

var_dump(md5('hello', true));var_dump(md5('hello', false));

输出:

string(16) "]A@*�K*v�q��Œ"string(32) "5d41402abc4b2a76b9719d911017c592"

3、科学计数法(0e绕过)

md5() 遇到「公式」,会先「运算」,再对运算结果「计算」MD5。

由于0和任何数相乘都等于0,所以0e开头的任何数,其MD5都是相同的。

比如 md5('0e1234'),会先运算成 md5(0),再计算MD5值。

补充:

0e是科学计数法,大小写等价,即 0e 和 0E 的结果相同。
科学记数法是一种记数的方法。把一个数表示成a与10的n次幂相乘的形式。
格式为:aEb=a×10^b,即a乘以10的b次幂。

实例:

echo md5(0).PHP_EOL;echo md5(0e123).PHP_EOL;echo md5(0e456).PHP_EOL;echo md5(0E456);

输出:

cfcd208495d565ef66e7dff9f98764dacfcd208495d565ef66e7dff9f98764dacfcd208495d565ef66e7dff9f98764dacfcd208495d565ef66e7dff9f98764da

绕过思路1:遇到弱比较( md5(a)==md5(b) )时,可以使用 0e绕过。

实例:

var_dump(md5(0e123) === md5(0e456));var_dump(md5(0e123) == md5(0e456));

输出:

bool(true)bool(true)

0e绕过还有一种变体:如果某个字符串的MD5值是0e开头的,在比较时,PHP也会先把它计算成 0,再参与比较。

绕过思路2:遇到若比较( md5(a)==0 ),可以传入QNKCDZO等绕过。

echo md5('QNKCDZO').PHP_EOL;var_dump(md5('QNKCDZO') == 0);

输出:

0e830400451993494058024219903391bool(true)

一些MD5值为0e开头的字符串:

QNKCDZO   => 0e830400451993494058024219903391240610708 => 0e462097431906509019562988736854s878926199a => 0e545993274517709034328855841020s155964671a => 0e342768416822451524974117254469s214587387a => 0e848240448830537924465865611904s214587387a => 0e848240448830537924465865611904

4、数组类型(数组绕过)

md5() 不能处理数组,数组都返回null。同时会报一个Warning,不影响执行,不用管。

实例:

var_dump(md5([1,2]));var_dump(md5([3,4]));

输出:

Warning: md5() expects parameter 1 to be string,NULLWarning: md5() expects parameter 1 to be string,NULL

绕过思路:遇到强比较(a===b)时,可以使用数组绕过。GET传参时,以 a[]=1&b[]=2 这种形式传递数组。

实例:

$a = array(1,2,3);$b = array(4,5,6);var_dump(md5($a)===md5($b));

输出:

Warning: md5() expects parameter 1 to be string,Warning: md5() expects parameter 1 to be string,bool(true)

5、算数运算配合自动类型转换

md5() 遇到运算符,会先运算,再计算结果的MD5值。

实例:

echo md5(1+2).PHP_EOL;echo md5(3).PHP_EOL;echo md5(1*2).PHP_EOL;echo md5(2).PHP_EOL;echo md5(1&1).PHP_EOL;echo md5(true);

输出:

eccbc87e4b5ce2fe28308fd9f2a7baf3eccbc87e4b5ce2fe28308fd9f2a7baf3c81e728d9d4c2f636f067f89cc14862cc81e728d9d4c2f636f067f89cc14862cc4ca4238a0b923820dcc509a6f75849bc4ca4238a0b923820dcc509a6f75849b

当字符串与数字类型运算时,会将字符串转换成数字类型,再参与运算,最后计算运算结果的MD5值。

实例:

echo md5('1'+2).PHP_EOL;echo md5(3).PHP_EOL;echo md5('1'*2).PHP_EOL;echo md5(2);

输出:

eccbc87e4b5ce2fe28308fd9f2a7baf3eccbc87e4b5ce2fe28308fd9f2a7baf3c81e728d9d4c2f636f067f89cc14862cc81e728d9d4c2f636f067f89cc14862c

6、数值类型

虽然 md5() 要求传入字符串,但传入整数或小数也不会报错;数字相同时,数值型和字符串的计算结果是相同的。

实例:

var_dump(md5(123));var_dump(md5('123'));var_dump(md5(10.1));var_dump(md5('10.1'));

输出:

string(32) "202cb962ac59075b964b07152d234b70"string(32) "202cb962ac59075b964b07152d234b70"string(32) "88d1955de012defb14b2db6f4797ff20"string(32) "88d1955de012defb14b2db6f4797ff20"

来源地址:https://blog.csdn.net/wangyuxiang946/article/details/131754105

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯