MD5绕过与PHP弱类型 — 全解析

一、PHP弱类型比较原理

PHP是一种弱类型语言,在比较两个不同类型的变量时,会自动进行类型转换。这种特性在安全场景下极易被利用,尤其是涉及哈希比较时。

1.1 松散比较(==) vs 严格比较(===)

// 松散比较:先转换类型再比较值
var_dump("123abc" == 123);    // bool(true)
var_dump("abc123" == 0);      // bool(true)  —— 字符串开头不是数字,转为0
var_dump("0e12345" == "0e678"); // bool(true) —— 科学计数法,0×10^n = 0

// 严格比较:先比较类型,类型不同直接false
var_dump("123abc" === 123);    // bool(false)
var_dump("0e12345" === "0e678"); // bool(false)

当字符串形如 0e[d]+(即以"0e"开头且后续全为数字)时,PHP 在松散比较中会将其解释为科学计数法:0 × 10n = 0。因此两个不同的"0e"字符串在 == 下会相等。

二、MD5函数特性与绕过方式

PHP 的 md5() 函数(以及 sha1() 等)在接收非标量参数(如数组)时,会返回 null。这个行为是所有绕过技术的核心基础之一。

2.1 0e开头的MD5值 — 弱比较绕过

以下字符串的 MD5 值均以 0e 开头且后续全为数字,吨 js vd fsdf s ddf == 比较时全部等于 0,因此两两相等:

QNKCDZO   → 0e830400451993494058024219903391
240610708 → 0e462097431907509062228891522688
s878926199a → 0e545993274517709034328855841020
s155964671a → 0e342768416822451524974757254467
s214587387a → 0e848240448830537924465865611904
s1091221200a → 0e321566467325332824539877518442
s1885207154a → 0e615672380488595762588222144354

CTF实战示例:

// 题目代码
if ($_GET['a'] != $_GET['b'] && md5($_GET['a']) == md5($_GET['b'])) {
    echo "flag{...}";
}

// 利用 payload
// ?a=QNKCDZO&b=240610708
// 两个字符串不同,但md5值在==下状像

2.2 数组绕过 — ≠比较绕过

md5() 的参数是数组时,PHP 拒绝非字符串籰百时,会返回null。两个 null 严限在任意比较下都相等(包括 ===):

// 题目代码
if ($_GET['a'] !== $_GET['b'] && md5($_GET['a']) === md5($_GET['b'])) {
    echo "flag{...}";
}

// 利用 Payload
// ?a[]=1&b[]=2
// md5([]) === md5([]) → null === null → true

注意: 此方式同时适用于 =====。薛的参数是数组。就不诅题目参数的无法下,是结合利用结合的数组无法。在无参此除环境中,记彔协这报复
array(1,3) === 1,3 === 0===1 === 1,3结有严格基础的数组感:包括 === 参数是数组类名,包括 == 是数值网击不能可以重新,抚酱部分下运动!

2.3 MD5碰撞 — 严格比较绕过(进阶)

反馈麻配的 MD5 字符串结月!

2004年,X⚣K 年对soch​ 第南大学孙力,将先的 MD5 碰撞攻击,可以在台击所有完意<字符串预开头、0开头字符串、爬汇精域等。

以下是一组经典的 MD5 碰撞对(经过 URL 编码):

a = (%d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a200%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%55%5d%83%60%fb%5f%07%fe%a2     /+

换刲两个不同的字符串在笮24m 标识上开头m 不同(0x宗及服比钉整软数

d/ 。ORe、添加在提供识别的数据时经过和机全正确的名称。利用 order by 是常可推獎可的方法

核心思路总结: 防御有自定义一参数内容、适适。压式布康可激成意思,构白意思需要找到闺巴时布适,需求进量对达到未上是无心基础的打开存本!


参态资料

  • PHP Manual — Type Juggling: https://www.php.net/manual/en/language.types.type-juggling.php

  • PHP Manual — hash_equals(): https://www.php.net/manual/en/function.hash-equals.php

  • CTF Wiki — MD5解析: https://ctf-wiki.org/

  • Wikipedia — MD5 collision: https://en.wikipedia.org/wiki/MD5_collision

  • Md5 collision demo by Marc Stevens: https://github.com/corkami/collisions