news 2026/6/10 19:32:20

php md5值与数值字符串强弱比较问题

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
php md5值与数值字符串强弱比较问题

经典的PHP类型混淆导致安全漏洞,主要出现在松散比较(==)和弱类型转换中。


1.问题核心

松散比较(==)的问题

// 弱类型比较示例 var_dump(0 == "0"); // true var_dump(0 == "0e123456"); // true (科学计数法) var_dump("0e123" == "0e456"); // true (都被解释为0)

MD5哈希的特性

MD5哈希是32位十六进制字符串:

  • 包含字符:0-9, a-f

  • 格式如:e10adc3949ba59abbe56e057f20f883e

  • 当哈希以0e开头,后跟纯数字时,会被解释为科学计数法的0


2.漏洞原理

科学计数法解释

// PHP将"0e"开头的字符串解释为科学计数法 $hash1 = "0e462097431906509019562988736854"; $hash2 = "0e830400451993494058024219903391"; var_dump($hash1 == 0); // true var_dump($hash1 == $hash2); // true! 漏洞所在 // 因为:0e462... 和 0e830... 都被解释为 0 * 10^...

实际攻击场景

// 1. 密码哈希比较漏洞 $user_input = "QNKCDZO"; // md5: 0e830400451993494058024219903391 $stored_hash = md5($user_input); // 0e830... if ($stored_hash == "0") { // 攻击者猜测 echo "绕过成功!"; } // 2. 两个不同字符串的MD5以0e开头 $a = "240610708"; // md5: 0e462097431906509019562988736854 $b = "QNKCDZO"; // md5: 0e830400451993494058024219903391 if (md5($a) == md5($b)) { // true! echo "哈希碰撞!"; }

3.已知的0e哈希值

// 原始值 => MD5哈希 $vulnerable_pairs = [ "240610708" => "0e462097431906509019562988736854", "QNKCDZO" => "0e830400451993494058024219903391", "aabg7XSs" => "0e087386482136013740957780965295", "aabC9RqS" => "0e041022518165728065344349536299", "s878926199a" => "0e545993274517709034328855841020", "s155964671a" => "0e342768416822451524974117254469", ];

4.漏洞利用场景

场景1:密码重置绕过

// 危险代码示例 $password = $_POST['password']; $hash = md5($password); if ($hash == $stored_hash) { // 使用 == // 攻击者输入"240610708"可能匹配"QNKCDZO"的哈希 }

场景2:身份验证绕过

// 登录验证 function checkPassword($input, $stored_hash) { return md5($input) == $stored_hash; // 漏洞! } // 攻击:如果存储的哈希是0e开头的 // 输入任意0e开头的MD5原始值

场景3:API签名验证

// 签名验证 $sign = $_GET['sign']; // 应该是MD5 $expected = md5($data . $key); if ($sign == $expected) { // 漏洞 // 如果$expected是0e开头,sign=0也可通过 }

5.SHA1的类似问题

// SHA1也存在类似问题 $a = "aaroZmOk"; // sha1: 0e66507019969427134894567494305185566735 $b = "aaK1STfY"; // sha1: 0e76658526655756207688271159624026011393 var_dump(sha1($a) == sha1($b)); // true!

6.CTF常见考点

考点1:哈希扩展攻击

// MD5长度扩展攻击 $secret = "secret"; $data = "data"; $hash = md5($secret . $data); // 攻击者可构造 $secret . $data . padding . appended_data // 而无需知道$secret

考点2:JSON中的哈希比较

$data = json_decode($_POST['data'], true); if ($data['hash'] == md5($data['input'])) { // 如果data.hash=0,且md5(input)以0e开头 }

考点3:数组绕过

// MD5处理数组返回null var_dump(md5([])); // NULL var_dump(md5([]) == NULL); // true

代码审计检查点

  1. 查找松散比较:全局搜索==!=

  2. 查找MD5/SHA1使用md5(sha1(

  3. 检查哈希比较位置

    // 危险模式 if ($_GET['hash'] == md5($data)) {...} if (md5($a) == md5($b)) {...}
  4. 检查JSON/序列化数据:反序列化后可能类型混淆

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 18:55:06

加法器操作指南:使用Logisim仿真初体验

加法器不是“连线游戏”:在Logisim里真正搞懂它,才叫入门数字电路 你有没有试过——在Logisim里拖出几个门、连好线、点下模拟按钮,LED亮了,就以为“加法器做出来了”? 然后一加 7 8 ,输出却是 15 的…

作者头像 李华
网站建设 2026/5/29 0:48:51

Matlab【独家原创】基于TCN-LSTM-SHAP可解释性分析的分类预测

目录 1、代码简介 2、代码运行结果展示 3、代码获取 1、代码简介 (TCN-LSTMSHAP)基于时间卷积网络结合长短期记忆神经网络的数据多输入单输出SHAP可解释性分析的分类预测模型 由于TCN-LSTM在使用SHAP分析时速度较慢,程序中附带两种SHAP的计算文件(正常版和提速…

作者头像 李华
网站建设 2026/6/5 21:17:35

Flink Watermark机制:解决大数据流处理中的乱序问题

Flink Watermark机制:用“时间截止线”解决大数据流的乱序难题 关键词 Flink、Watermark(水位线)、事件时间、乱序流、窗口计算、迟到数据、分布式时间同步 摘要 在实时大数据流处理中,“数据乱序” 是最棘手的问题之一——就…

作者头像 李华
网站建设 2026/6/10 16:55:40

java+vue+springboot残疾人信息管理系统需求

目录系统概述核心功能需求技术实现要点扩展功能建议注意事项项目技术支持可定制开发之功能亮点源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作系统概述 JavaVueSpringBoot残疾人信息管理系统是一个为残联、社区或福利机构设计的数字化管理…

作者头像 李华
网站建设 2026/6/10 11:11:11

开题报告vb酒店客房部

目录 酒店客房部概述主要职能与工作内容技术应用与管理服务质量标准 项目技术支持可定制开发之功能亮点源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作 酒店客房部概述 酒店客房部是酒店运营的核心部门之一,主要负责客房清洁、…

作者头像 李华
网站建设 2026/6/10 14:38:21

一文讲透 LLM、RAG、MCP 与 AI Agent:AI 系统的四个核心层级

一文讲透 LLM、RAG、MCP 与 AI Agent:AI 系统的四个核心层级 这四个概念确实是当前AI领域最核心且容易混淆的技术层级。简单来说,它们代表了从“基础模型”到“智能体系统”的四个不同层次: 一个核心比喻: 想象一个顶尖的人类专家(LLM),他需要去完成一项复杂任务(如制…

作者头像 李华