PHP—MD5和sha1绕过

本文探讨了PHP中数组绕过、特殊字符串的0e处理、双重MD5下的0e绕过,以及如何利用MD5和SHA1进行数据安全性规避。通过实例解析了NAN、INF、碰撞攻击和不同技术场景下的漏洞利用技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 数组绕过

对于php强比较和弱比较:md5(),sha1()函数无法处理数组,如果传入的为数组,会返回NULL,所以两个数组经过加密后得到的都是NULL,也就是相等的。

<?php
$a=$_GET['a'];
$b=$_GET['b'];
if ($a!==$b && md5($a)===md5($b)){
    return "hahaha";
}

使用:

?a[]=1&b[]=2

2 0e绕过弱比较

对于某些特殊的字符串加密后得到的密文以0e开头,PHP会当作科学计数法来处理,也就是0的n次方,得到的值比较的时候都相同:

<?php
$a=$_GET['a'];
$b=$_GET['b'];
if ($a!==$b && md5($a)==md5($b)){
    return "hahaha";
}

md5:

240610708:0e462097431906509019562988736854
QLTHNDT:0e405967825401955372549139051580
QNKCDZO:0e830400451993494058024219903391
PJNPDWY:0e291529052894702774557631701704
NWWKITQ:0e763082070976038347657360817689
NOOPCJF:0e818888003657176127862245791911
MMHUWUV:0e701732711630150438129209816536
MAUXXQC:0e478478466848439040434801845361

sha1:

10932435112: 0e07766915004133176347055865026311692244
aaroZmOk: 0e66507019969427134894567494305185566735
aaK1STfY: 0e76658526655756207688271159624026011393
aaO8zKZF: 0e89257456677279068558073954252716165668
aa3OFF9m: 0e36977786278517984959260394024281014729
0e1290633704: 0e19985187802402577070739524195726831799

3 双重md5下的0e绕过

以下字符串进行两次md5后以0e开头

  • 7r4lGXCH2Ksu2JNT3BYM
  • CbDLytmyGm2xQyaLNhWn
  • 770hQgrBOjrcqftrlaZk

4 $a==md5($a)

0e215962017 的 MD5 值也是由 0e 开头,在 PHP 弱类型比较中相等

5 md5绕过SQL

ffifdyop,经过md5函数后结果为 'or'6\xc9]\x99\xe9!r,\xf9\xedb\x1c

129581926211651571912466741651878684928,经过md5函数后结果为 \x06\xdaT0D\x9f\x8fo#\xdf\xc1'or'8

6 NaN 和 INF

NANINF,分别为非数字和无穷大,但是var_dump一下它们的数据类型却是double,那么在md5函数处理它们的时候,是将其直接转换为字符串”NAN”和字符串”INF”使用的,但是它们拥有特殊的性质,它们与任何数据类型(除了true)做强类型或弱类型比较均为false,甚至NAN===NAN都是false,但md5('NaN')===md5('NaN')为true。

7 md5碰撞,sha1碰撞

使用碰撞可以绕过不同字符串,相同md5/sha1的强比较

MD5碰撞:
url:

两组经过url编码后的值,

#1
a=M%C9h%FF%0E%E3%5C%20%95r%D4w%7Br%15%87%D3o%A7%B2%1B%DCV%B7J%3D%C0x%3E%7B%95%18%AF%BF%A2%00%A8%28K%F3n%8EKU%B3_Bu%93%D8Igm%A0%D1U%5D%83%60%FB_%07%FE%A2   
b=M%C9h%FF%0E%E3%5C%20%95r%D4w%7Br%15%87%D3o%A7%B2%1B%DCV%B7J%3D%C0x%3E%7B%95%18%AF%BF%A2%02%A8%28K%F3n%8EKU%B3_Bu%93%D8Igm%A0%D1%D5%5D%83%60%FB_%07%FE%A2   
#2
a=%4d%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%a2%00%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   
b=%4d%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%
#3
$a="\x4d\xc9\x68\xff\x0e\xe3\x5c\x20\x95\x72\xd4\x77\x7b\x72\x15\x87\xd3\x6f\xa7\xb2\x1b\xdc\x56\xb7\x4a\x3d\xc0\x78\x3e\x7b\x95\x18\xaf\xbf\xa2\x00\xa8\x28\x4b\xf3\x6e\x8e\x4b\x55\xb3\x5f\x42\x75\x93\xd8\x49\x67\x6d\xa0\xd1\x55\x5d\x83\x60\xfb\x5f\x07\xfe\xa2";
$b="\x4d\xc9\x68\xff\x0e\xe3\x5c\x20\x95\x72\xd4\x77\x7b\x72\x15\x87\xd3\x6f\xa7\xb2\x1b\xdc\x56\xb7\x4a\x3d\xc0\x78\x3e\x7b\x95\x18\xaf\xbf\xa2\x02\xa8\x28\x4b\xf3\x6e\x8e\x4b\x55\xb3\x5f\x42\x75\x93\xd8\x49\x67\x6d\xa0\xd1\xd5\x5d\x83\x60\xfb\x5f\x07\xfe\xa2";
文件:

linux使用md5collgen碰撞生成两个md5值相同但内容不同的文件

md5collgen -o 1.bin 2.bin

windows可以下载fastcoll,碰撞生成两个md5值相同但内容不同的文件

fastcoll.exe -p 123.txt -o 1.txt 2.txt
sha1碰撞:
url:
a=%25PDF-1.3%0A%25%E2%E3%CF%D3%0A%0A%0A1%200%20obj%0A%3C%3C/Width%202%200%20R/Height%203%200%20R/Type%204%200%20R/Subtype%205%200%20R/Filter%206%200%20R/ColorSpace%207%200%20R/Length%208%200%20R/BitsPerComponent%208%3E%3E%0Astream%0A%FF%D8%FF%FE%00%24SHA-1%20is%20dead%21%21%21%21%21%85/%EC%09%239u%9C9%B1%A1%C6%3CL%97%E1%FF%FE%01%7FF%DC%93%A6%B6%7E%01%3B%02%9A%AA%1D%B2V%0BE%CAg%D6%88%C7%F8K%8CLy%1F%E0%2B%3D%F6%14%F8m%B1i%09%01%C5kE%C1S%0A%FE%DF%B7%608%E9rr/%E7%ADr%8F%0EI%04%E0F%C20W%0F%E9%D4%13%98%AB%E1.%F5%BC%94%2B%E35B%A4%80-%98%B5%D7%0F%2A3.%C3%7F%AC5%14%E7M%DC%0F%2C%C1%A8t%CD%0Cx0Z%21Vda0%97%89%60k%D0%BF%3F%98%CD%A8%04F%29%A1
b=%25PDF-1.3%0A%25%E2%E3%CF%D3%0A%0A%0A1%200%20obj%0A%3C%3C/Width%202%200%20R/Height%203%200%20R/Type%204%200%20R/Subtype%205%200%20R/Filter%206%200%20R/ColorSpace%207%200%20R/Length%208%200%20R/BitsPerComponent%208%3E%3E%0Astream%0A%FF%D8%FF%FE%00%24SHA-1%20is%20dead%21%21%21%21%21%85/%EC%09%239u%9C9%B1%A1%C6%3CL%97%E1%FF%FE%01sF%DC%91f%B6%7E%11%8F%02%9A%B6%21%B2V%0F%F9%CAg%CC%A8%C7%F8%5B%A8Ly%03%0C%2B%3D%E2%18%F8m%B3%A9%09%01%D5%DFE%C1O%26%FE%DF%B3%DC8%E9j%C2/%E7%BDr%8F%0EE%BC%E0F%D2%3CW%0F%EB%14%13%98%BBU.%F5%A0%A8%2B%E31%FE%A4%807%B8%B5%D7%1F%0E3.%DF%93%AC5%00%EBM%DC%0D%EC%C1%A8dy%0Cx%2Cv%21V%60%DD0%97%91%D0k%D0%AF%3F%98%CD%A4%BCF%29%B1
文件:

两个SHA1值相同而不一样(SHA256的值不同)的pdf文件, shattered-1.pdfshattered-2.pdf

参考:

『CTF Tricks』PHP-绕过md5()

<think>好的,我现在需要解决用户的问题:PHPMD5特性的变化以及为何早期可被绕过而后期不行。首先,我得回顾一下MD5PHP中的应用历史,尤其是与安全相关的问题。 用户提到早期可以通过某些方式绕过MD5加密,比如引用[1]中的例子,使用' or '6xxx这样的字符串,经过MD5处理后可能产生特定的哈希值,导致SQL注入。这可能是因为早期的MD5函数在处理某些输入时存在漏洞,例如Magic Hash的情况,比如0e开头的哈希值在比较时会被视为0,导致验证绕过。 接下来,我需要分析PHP版本更新中对MD5函数的改进。可能包括类型检查的严格化,比如字符串比较而非类型比较。例如,PHP在后续版本中建议使用===而不是==,避免将字符串转换为科学计数法导致的错误判断。此外,预处理输入数据,如引用[2]中提到的php://input的使用条件变化,可能影响数据输入方式,从而影响MD5的处理。 另外,引用[3]提到建立后门的方法,这可能不直接相关,但需要考虑MD5是否曾被用于生成后门密码,而后续版本修复了这种漏洞。还有引用[4]中的需求分析,可能涉及系统安全性设计的改进,比如加输入验证,防止MD5绕过。 需要确认的关键点包括:Magic Hash漏洞的原理,PHP版本在处理字符串比较时的变化,以及开发者是否采用了更安全的比较方式。例如,早期的PHP应用可能使用松散比较,使得'0e123456' == 0 成立,而后续版本可能未改变函数本身,但开发者转而使用严格比较或对输入进行更好的过滤。 总结起来,早期绕过是因为类型比较特定哈希值的存在,后期PHP版本可能虽然没有直接修改MD5算法,但通过语言特性的调整开发者实践的改变(如使用===,预处理输入)来防止此类绕过。同时,服务器端验证的加,如过滤特殊字符,防止SQL注入,也减少了MD5漏洞被利用的机会。</think>### PHPMD5特性变化及绕过问题的分析 #### 1. **早期MD5绕过漏洞的原理** 在PHP早期版本中,MD5绕过主要依赖于两个特性: - **类型比较(Loose Comparison)**:当使用`==`比较字符串时,PHP会将类似`"0e123456"`的字符串解析为科学计数法的数值`0`。若两个MD5哈希值均以`0e`开头且后续为纯数字(例如`0e462097431906509019562988736854`),则会被判定为相等[^1]。 - **Magic Hash的存在**:某些特定字符串(如`240610708`)的MD5哈希值恰好为`0e`开头,例如: $$md5("240610708") = 0e462097431906509019562988736854$$ 攻击者可构造此类输入,使系统误认为哈希匹配,从而绕过身份验证。 #### 2. **PHP版本迭代中的改进** 虽然MD5算法本身未改变,但PHP生态的改进显著降低了绕过风险: - **严格类型检查的普及**:开发者逐渐改用`===`(严格比较)替代`==`,直接比对字符串内容而非转换后的数值。 - **输入过滤的加**:例如引用[1]提到的SQL注入场景,开发者会对输入进行转义或参数化查询,避免`'or'6xxx`类字符串直接拼接SQL。 - **安全编码规范推广**:PHP官方文档及社区更调对哈希值加盐(Salt)处理,例如: ```php $hashed = md5($password . $salt); // 增加唯一盐值,防止彩虹表攻击 ``` #### 3. **后期绕过不可行的关键原因** - **类型比较场景减少**:现代框架(如Laravel、Symfony)默认使用安全哈希库(如`password_hash()`),且制严格比较。 - **服务器防护升级**:WAF(Web应用防火墙)可识别类似`0e`开头的异常哈希请求并拦截。 - **加密方式迭代**:MD5因其碰撞漏洞(如“彩虹表攻击”)逐渐被SHA-256、bcrypt等更安全的算法替代。 --- ### 示例代码对比 **早期不安全实现:** ```php // 使用松散比较且未加盐 if (md5($_POST['password']) == $stored_hash) { // 授权通过 } ``` **现代安全实现:** ```php // 使用password_verify() + bcrypt $hashed = password_hash($password, PASSWORD_BCRYPT); if (password_verify($input, $hashed)) { // 授权通过 } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Snakin_ya

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值