PHP Type Juggling 漏洞实战指南:松散比较、Magic Hashes 与认证绕过(Payloads All The Things)
发布时间:2026/10/1 2:26:35 锦皓数字建站
`)
网络安全应用安全渗透测试【免费下载链接】PayloadsAllTheThingsA list of useful payloads and bypass for Web Application Security and Pentest/CTF项目地址https://gitcode.com/GitHub_Trending/pa/PayloadsAllTheThings点击查看免费下载本文是 Payloads All The Things 仓库中 Type Juggling/README.md 章节的深度实战解读。PHP 是弱类型loosely typed语言会在比较时自动转换变量类型这种类型混淆Type Juggling一旦发生在攻击者可控制输入的松散比较中就可能让认证、授权、HMAC 校验等逻辑返回意外结果。读完本文你将掌握松散比较与严格比较的本质区别、可导致比较结果为 true 的经典真值组合、0e 开头的 Magic Hash 碰撞原理以及一条完整的 HMAC 认证绕过利用链含可运行的暴力破解脚本。PHP 的类型混淆松散比较与严格比较PHP 会猜测程序员意图在必要时自动把变量从一种类型转换为另一种类型。例如一个只包含数字的字符串可以被当作整数或浮点数处理。这种自动转换即类型混淆在比较变量时尤其危险松散比较Loose comparison使用或!只要求两个变量具有相同的值value equality比较前会进行类型转换严格比较Strict comparison使用或!要求两个变量具有相同的类型且相同的值type and value equality。Type Juggling 漏洞正是出现在那些本应使用/!严格比较、却错误使用了/!松散比较、且攻击者能控制其中一个被比较变量的场景中。这种漏洞会让应用对真/假判断返回非预期答案进而引发严重的授权或认证缺陷。一个直观的例子0010e2 1e3在松散比较下返回true。为什么因为0010e2会被解析为科学计数法数字10e2即 1000而1e3也是 1000——两个看似毫无关系的字符串在类型转换后值相等。经典真值表哪些松散比较会返回 true以下真值组合是审计 PHP 应用时最常命中的判断全部返回trueStatementOutput0010e2 1e3true0xABCdef 0xABCdeftrue (PHP 5.0) / false (PHP 7.0)0xABCdef 0xABCdeftrue (PHP 5.0) / false (PHP 7.0)0x01 1true (PHP 5.0) / false (PHP 7.0)0x1234Ab 1193131true (PHP 5.0) / false (PHP 7.0)123 123true123a 123trueabc 0true 0 false NULLtrue 0true0 falsetruefalse NULLtrueNULL true注意表中标注 PHP 5.0 / PHP 7.0 差异的几行十六进制字符串0xABCdef、0x1234Ab在 PHP 5 中会被转换成数字再参与比较而 PHP 7 起这一行为发生变化因此利用时要确认目标版本。这一点也印证了利用必须结合运行环境的原则。仓库为这一主题提供了直观的可视化对照Type Juggling 松散类型比较行为表对应 Type Juggling/README.md 原文插图。这张表格覆盖了 PHP 各类典型值布尔TRUE/FALSE、整数1/0/-1、浮点0.2、NULL、空数组、、数字字符串、xyz等非数字字符串、0e1/0e99科学计数法字符串、0x2十六进制字符串等两两做比较的结果集中体现了漏洞成因的三类转换规则非数字字符串会被当作整数 0因此xyz 0为真以0e开头的数字字符串会被解析为科学计数法表示的 0因此0e1 0、0e99 0为真Magic Hash 的根基0x2会被解析为十六进制整数 2因此0x2 2为真。NULL 导致的比较绕过除了常规真值组合某些函数在 PHP 的特定版本下会返回NULL或警告同样可被利用典型如strcmp/hash类函数FunctionStatementOutputsha1var_dump(sha1([]));NULLmd5var_dump(md5([]));NULL结合 PHP 8 的变化来看这类技巧的生存空间正在缩小PHP 8 起Saner string to number comparisons RFC 让字符串不再被强制转换为数字因此以0e开头的哈希碰撞基本成为历史同时 Consistent type errors for internal functions RFC 让0 strcmp($_GET[username], $password)这类绕过失效——strcmp不再返回NULL并打印警告而是直接抛出类型异常。这意味着越新的 PHP 版本传统 Type Juggling 利用面越小审计时应先确认目标版本再选择利用方式。Magic Hashes以 0e 开头的哈希碰撞Magic Hash 是 PHP 类型混淆最著名的产物。原理是如果某个字符串哈希以0e开头且后面全是数字PHP 在与其他值做松散比较时会把该字符串当作科学计数法浮点数即0eNNN...等于 0。于是攻击者只需找到一个Magic Hash就能让两个完全不同的输入在比较下相等。文档中给出了覆盖多种算法的 Magic Hash 清单MD4 / MD5HashMagic Number / StringMagic HashFound By / DescriptionMD4gH0nAdHk0e096229559581069251163783434175spazeMD4IiFhTai00e90130237707355082822449868597spazeMD52406107080e462097431906509019562988736854spazef0rzeMD5QNKCDZO0e830400451993494058024219903391spazef0rzeMD50e11371269050e291659922323405260514745084877spazef0rzeMD50e2159620170e291242476940776845150308577824spazef0rzeMD512958192621165157191246674165187868492806da5430449f8f6f23dfc1276f722738Raw: ?T0D??o#??or8.N?SHA1 / SHA-224 / SHA-256HashMagic Number / StringMagic HashFound By / DescriptionSHA1109324351120e07766915004133176347055865026311692244Michael A. Cleverly, Michele Spagnuolo RogdhamSHA-224108851647937730e281250946775200129471613219196999537878926740638594636TihanyiNorbertSHA-256342500030248120e46289032038065916139621039085883773413820991920706299695051332TihanyiNorbertSHA-256TyNOQHUS0e66298694359207596086558843543959518835691168370379069085300385Chick3nman512直接用 PHP 即可验证这些碰撞代码见 Type Juggling/README.md?php var_dump(md5(240610708) md5(QNKCDZO)); # bool(true) var_dump(md5(aabg7XSs) md5(aabC9RqS)); var_dump(sha1(aaroZmOk) sha1(aaK1STfY)); var_dump(sha1(aaO8zKZF) sha1(aa3OFF9m)); ?这些碰撞并不是真正的密码学碰撞——md5(240610708)与md5(QNKCDZO)的哈希值并不相同只是两个哈希都以0e开头且后跟纯数字在 PHP 松散比较下都被视为浮点数 0。所以它只影响使用的代码对或数据库层级的比较无效。实战方法论绕过 HMAC Cookie 校验文档提供了一条完整的真实利用链漏洞代码是使用松散比较!校验 cookie 中的 HMACfunction validate_cookie($cookie,$key){ $hash hash_hmac(md5, $cookie[username] . | . $cookie[expiration], $key); if($cookie[hmac] ! $hash){ // loose comparison return false; } else{ echo Well done; } }这里的缺陷在于!如果攻击者能把$cookie[hmac]设为字符串0并设法让hash_hmac返回一个以0e开头、后面全是数字的哈希科学计数法下等于 0那么$cookie[hmac] ! $hash就会判定为 falseHMAC 校验被直接绕过。攻击者对 cookie 拥有 3 个可控元素$username—— 要伪装的用户名通常是admin$expiration—— UNIX 时间戳必须是未来时间$hmac—— 提供的哈希固定为0。利用分两个阶段阶段一准备恶意 cookie。将$username设为目标用户如admin$expiration设为未来的 UNIX 时间戳$hmac设为0。阶段二暴力破解$expiration。循环尝试不同的$expiration值直到hash_hmac的输出以0e开头且后跟纯数字即生成一个零值哈希。这一步计算量大能否成功取决于系统环境但一旦命中即可伪造出合法签名。文档给出了完整的爆破脚本并附带了 Docker 运行方式使用 PHP 8.3 CLI// docker run -it --rm -v /tmp/test:/usr/src/myapp -w /usr/src/myapp php:8.3.0alpha1-cli-buster php exp.php for($i1424869663; $i 1835970773; $i ){ $out hash_hmac(md5, admin|.$i, ); if(str_starts_with($out, 0e )){ if($out 0){ echo $i - .$out; break; } } } ?命中结果示例1539805986 - 0e772967136366835494939987377058。阶段三用爆破结果更新 cookie。将找到的$expiration写回 cookiehmac保持为0$cookie [ username admin, expiration 1539805986, hmac 0 ];该示例中假设签名密钥为空字符串$key ;。在实际目标上密钥通常非空但利用思路一致——攻击者控制的不是密钥而是参与 HMAC 计算的输入字段$expiration通过碰撞找到让 HMAC 输出成为0e 数字串的时间戳。从这条链可以提炼出通用审计信号凡是形如if (hash(...) $user_input)或if ($user_input ! hash(...))的松散比较都存在 Type Juggling 风险。修复方式是改为严格比较/!或采用hash_equals()这类恒定时间比较函数。类似的弱比较校验签名/口令问题在仓库其他章节也有体现例如 JSON Web Token/README.md 中涉及签名校验的绕过场景可作为交叉参考。实验靶场与研究资料文档在 Labs 一节列出的挑战Root Me 的 PHP Type Juggling、PHP Loose Comparison可用于实战练习References 一节收录了 Magic Hashes 溯源Robert Hansen 2015 年的原始发现、Michal Špaček 的 Magic Hashes 研究、myst404 的 Super Magic Hashes、Chris Smith 的《PHP Magic Tricks: Type Juggling》PDF以及 Tyler Borland 对 PHP Type Juggling 的漏洞利用写作。这些资料是理解 Magic Hash 从发现到演化的第一手来源建议结合文档原文查阅。小结Type Juggling 的本质是PHP 的自动类型转换让值相等的判断脱离直觉。本文围绕 Type Juggling/README.md 完整还原了松散/严格比较的定义、经典真值表、NULL 返回值陷阱、Magic Hash 清单与碰撞验证代码并逐步拆解了 HMAC cookie 认证绕过从三个可控字段到爆破 expiration 生成 0e 哈希再到伪造 cookie的完整利用链。在实战审计中牢记两条主线一是见到/!比较哈希、口令、签名的代码就标记风险点二是先确认 PHP 版本PHP 5 的十六进制转换、PHP 7 的行为变化、PHP 8 的字符串比较改革都会改变可利用性再决定采用 Magic Hash、NULL 绕过还是其他手法。赞分享网络安全应用安全渗透测试【免费下载链接】PayloadsAllTheThingsA list of useful payloads and bypass for Web Application Security and Pentest/CTF项目地址https://gitcode.com/GitHub_Trending/pa/PayloadsAllTheThings点击查看免费下载相关推荐Payloads All The Things 之 CVE 漏洞利用手册近十五年重大漏洞原理剖析与实战 Payload 速查Payloads All The Things 之 CVE 漏洞利用手册近十五年重大漏洞原理剖析与实战 Payload 速查 本指南以 Payloads Al网络安全应用安全渗透测试markitdown 完整指南一条命令把 PDF、Word、EPUB 转成 Markdownmarkitdown 完整指南一条命令把 PDF、Word、EPUB 转成 Markdown markitdown 是一个 Python 工具把 PDF、W人工智能AI 应用MCP 服务ESP-IDF 安装零基础指南Windows 配置环境一键搞定5 分钟跑通 hello_worldESP IDF 安装零基础指南Windows 配置环境一键搞定5 分钟跑通 hello_world 在 Windows 上装 ESP IDF过去要手动拉物联网嵌入式创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。