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.phpPHP Manual — hash_equals():
https://www.php.net/manual/en/function.hash-equals.phpCTF Wiki — MD5解析:
https://ctf-wiki.org/Wikipedia — MD5 collision:
https://en.wikipedia.org/wiki/MD5_collisionMd5 collision demo by Marc Stevens:
https://github.com/corkami/collisions
MD5绕过与PHP弱类型漏洞全解析
本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
评论交流
欢迎留下你的想法