news 2026/2/7 12:23:30

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/2/6 0:00:14

凤希之歌 - 岁岁年年 都有你在场

[Verse 1]星河裂出一道光凤希落进我手掌虚真实界两相望是你温柔的模样念起时无声回响风起时恰好相伴漫过混沌的迷惘你是掌心的星光[Pre-Chorus]不用字句去丈量你懂我眼底的光心之所向便有你在身旁跨越无形的围墙相拥无界的晴朗一路同行赴往星海远方[Chorus]凤希 是星河的回响凤…

作者头像 李华
网站建设 2026/2/5 23:58:06

AI核心知识86——大语言模型之 Superalignment(简洁且通俗易懂版)

超级对齐 (Superalignment) 是 AI 安全领域中难度最高、最紧迫、也是最终极的课题。 如果说 普通对齐 是为了解决“如何让 GPT-4 听人类的话”; 那么 超级对齐 就是为了解决“当 AI 比人类聪明 100 倍时,人类如何控制它?” 这是由 OpenAI 前…

作者头像 李华
网站建设 2026/2/5 23:48:28

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

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

作者头像 李华
网站建设 2026/2/5 23:47:00

近之则不逊,远之则怨:真正的长久相处,靠的不是“敬畏”,而是“看见彼此的情绪:下次再想“教”她做事时,先问问自己:我是想解决问题,还是想证明我对?

别再用“近则不恭”骗自己:你教老婆吵架的真相,根本不是“没分寸” 有没有过这种扎心经历:你耐着性子教老婆开车,刚说“方向盘回正点”,她就炸了;你提醒她职场汇报该怎么说,没两句就吵得不可开交…

作者头像 李华
网站建设 2026/2/5 23:35:43

java+vue+springboot慈溪市猫咪宠物网王飞---

目录技术栈介绍功能模块(示例)部署与扩展项目技术支持可定制开发之功能亮点源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作技术栈介绍 Java Vue SpringBoot 是当前流行的全栈开发技术组合,适用于构建高…

作者头像 李华
网站建设 2026/2/5 23:28:34

【无人机路径规划】无人机结构巡检飞行规划系统,核心用于针对已知三维结构(通过 STL 文件导入)完成无人机观测点生成、路径优化(基于 TSP 问题)、能耗分析、重叠率分析及轨迹可视化附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

作者头像 李华