md5强弱碰撞

一,类型。

1.弱比较

php中的"=="和"===="在进行比较时,数字和字符串比较或者涉及到数字内容的字符串,则字符串会被转换为数值并且比较按照数值来进行。按照此理,我们可以上传md5编码后是0e的字符串,在比较时php语言会将0e开头的数据认为是科学记数法,而后面的数据会被当做0。

例如:a=xxx&b=xxxx

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

2.强比较

php中的''==='在比较时先判断字符串类型是否相同,再比较值。

数组绕过:md5不能加密数组,在加密数组的时候会返回NULL,如果设置没有判断变量类型或内容,就可以使用,因此,强弱比较都是可以使用数组绕过的。

eg:a[]=1&b[]=2

3.真实碰撞对(md5值)

eg:

0e306561559aa787d00bc6f70bbdfe3404cf03659e704f8534c00ffb659c4c8740cc942feb2da115a3f4155cbb8607497386656d7d1f34a42059d78f5a8dd1ef

和0e306561559aa787d00bc6f70bbdfe3404cf03659e744f8534c00ffb659c4c8740cc942feb2da115a3f415dcbb8607497386656d7d1f34a42059d78f5a8dd1ef

二,示例

[SWPUCTF 2021 新生赛]easy_md5(弱)

1.包含有一个flag.php的文件,然后 get传参name,post传参password,当name和password的值不等,但是他们的md5值相等时,就会输出flag,否则输出wrong

2.数组绕过

3. 0e绕过

[BJDCTF 2020]easy_md5(sql+弱+强)

1.打开环境,提交查询后,在地址栏出现password=输入内容。

2.bp抓包重放后发现hint: select * from 'admin' where password=md5($pass,true)

3.绕过:ffifdyop

4.得到一个新的页面,看源码,get传参a和b的弱比较,数组绕过或0e绕过

数组绕过     ?a[]=1&b[]=2                  0e绕过      ?a=xxxx&b=xxxx

5.得到一个新页面,强比较post传参param1和param2。

post传参 数组绕过:param1[]=a&param2[]=b,得到flag

 [SWPUCTF 2022 新生赛]奇妙的MD5(sql+弱+强)

1.开始的绕过——ffifdyop

2.弱比较

3. 强比较:post传参wqh和dsy

 [NSSCTF 2022 Spring Recruit]babyphp(正则+强+0e弱)

1,打开环境,是一串代码,包含有一个flag.php文件

正则

:preg_match是php函数,会被搜索的结果所填充,进行正则表达式匹配。并且只匹配一次

此处为检查表单提交的数据是否满足以下条件:

  1. 变量 $_POST['a'] 是否存在;
  2. 变量 $_POST['a'] 中不包含数字;
  3. 变量 $_POST['a'] 可以转换为整数。

post传参a,正则绕过

可以使用数组绕过为a[]=1

2.要求b1和b2强碰撞

b1[]=3&b2[]=4

3.c1和c2弱碰撞,强调了要传入c1不等于c2且c1,c2都要是字符串,c1,c2的MD5值要相等 所以c就不能用数组绕过,可以用科学计数法0e绕过

c1=s878926199a&c2=s155964671a

4.同时满足以上条件

a[]=1&b1[]=3&b2[]=4&c1=s878926199a&c2=s155964671a

 

 [GDOUCTF 2023]受不了一点(php数字与字符比较)

1.php代码如下

1.post传参ctf和gdou会将ctf赋值给b以及gdou赋值给a并进行md5的强比较

ctf[]=1&gdou[]=2

2.get传参aaa和bbb要求其数值等于114514但是这两个的真实值不同(数字弱比较)

当字符串与数字进行比较时,字符串会转换成整型/浮点型进行比较$a='114514a'--->114514

aaa=114514&bbb=114514a

3.设置cookie=j0k3r

4.post传参flag与get传参flag,检查 $_POST['flag'] 是否等于字符串 'flag',或者 $_GET['flag'] 是否等于字符串 'flag'。如果任一条件为真,则它使用 die() 函数来终止脚本的执行

此处要不结束进程,flag的值要不相等或者我们可以直接不传flag

绕过:flag=33&33=flag或者分别传参不相等,这里我试验了没成功,但是按道理就是这样的,如果有能解答的请解答一下。

[UUCTF 2022 新生赛]funmd5(暂缓)

1.打开环境是一段代码

  • preg_replace 用于尝试替换掉可能的 "0e" 形式的字符串,但替换后的字符串并未被重新赋值给 $md5
  • preg_match 用于检查 $md5[0] 是否包含 "0e".
  • $sub 的赋值在 if(isset($md5)) 块之外是无效的.

三,md5碰撞实验

此类说明和解释了怎样生成和为什么可以做到不同行为的两个可执行文件具有相同的MD5值,直接参考吧。

网络攻防技术——MD5碰撞实验-优快云博客

四,ffifdyop——详解

select * from `admin` where password=md5($pass,true)

md5在此处是一个函数,语法为md5(string,raw)

string:必需,规定要使用的字符串。

raw:可选    默认不写为FALSE。32位16进制的字符串
             TRUE。16位原始二进制格式的字符串

当raw项为true时,返回的这个原始二进制不是普通的二进制(0,1),而是  'or'6\xc9]\x99\xe9!r,\xf9\xedb\x1c

32位16进制字符串:将MD5加密得到的128 位长度的值以每4位为一组,分为32组,每组以转换为16进制,进行转换得到一个32位的字符串。也就是md5加密。即md5的raw为true时,该函数的输出是原始二进制格式,会被作为字符串处理

构造一个语句使sql语句永恒为真 

布尔型判断时,以数字开头的字符串会被当做整型数,要单引号括起来(闭合语句),eg:password=‘xxx’ or ‘1xxxxxxxxx’,那么就相当于password=‘xxx’ or 1  ,也就是password=‘xxx’ or true,当xxx为纯数字时就可以不用引号

目标:要找一个字符串取32位16进制的md5值里带有276f7227这个字段的,加上数字部分

最终:想要得到一个可以绕过md5的值,就要有以下要素

1.   'or'    该符号对应的16进制是   276f7227 

2.   在276f7227这个字段后面紧跟一个数字,除了0,就是1-9,对应的asc码值是49-57,转化为16进制就是31-39,最终形式为276f7227+(31-39)

3.最终xxxxxx276f7227+(31-39)这样形式的md5值,但是因为md5的特性,要把这个从md5解密出来需要庞大的计算,因此一般不会去另找。

sha碰撞,MD5碰撞实现,#!/usr/local/bin/perl # It was noted that Intel IA-32 C compiler generates code which # performs ~30% *faster* on P4 CPU than original *hand-coded* # SHA1 assembler implementation. To address this problem (and # prove that humans are still better than machines:-), the # original code was overhauled, which resulted in following # performance changes: # # compared with original compared with Intel cc # assembler impl. generated code # Pentium -25% +37% # PIII/AMD +8% +16% # P4 +85%(!) +45% # # As you can see Pentium came out as looser:-( Yet I reckoned that # improvement on P4 outweights the loss and incorporate this # re-tuned code to 0.9.7 and later. # ---------------------------------------------------------------- # Those who for any particular reason absolutely must score on # Pentium can replace this module with one from 0.9.6 distribution. # This "offer" shall be revoked the moment programming interface to # this module is changed, in which case this paragraph should be # removed. # ---------------------------------------------------------------- # $normal=0; push(@INC,"perlasm","../../perlasm"); require "x86asm.pl"; &asm_init($ARGV[0],"sha1-586.pl",$ARGV[$#ARGV] eq "386"); $A="eax"; $B="ecx"; $C="ebx"; $D="edx"; $E="edi"; $T="esi"; $tmp1="ebp"; $off=9*4; @K=(0x5a827999,0x6ed9eba1,0x8f1bbcdc,0xca62c1d6); &sha1_block_data("sha1_block_asm_data_order"); &asm_finish(); sub Nn { local($p)=@_; local(%n)=($A,$T,$B,$A,$C,$B,$D,$C,$E,$D,$T,$E); return($n{$p}); } sub Np { local($p)=@_; local(%n)=($A,$T,$B,$A,$C,$B,$D,$C,$E,$D,$T,$E); local(%n)=($A,$B,$B,$C,$C,$D,$D,$E,$E,$T,$T,$A); return($n{$p}); } sub Na { local($n)=@_; return( (($n )&0x0f), (($n+ 2)&0x0f), (($n+ 8)&0x0f), (($n+13)&0x0f), (($n+ 1)&0x0f)); } sub X_expand { local($in)=@_; &comment("First, load the words onto the stack in network byte order"); for ($i=0; $i<16; $i+=2) { &mov($A,&DWP(($i+0)*4,$in,"",0));# unless $i == 0; &mov($B,&DWP(($i+1)*4,$in,"
尽管MD5算法曾经被广泛应用于数据完整性验证以及密码学领域,但它已经被证明存在严重的安全漏洞。以下是关于MD5碰撞攻击的概念及其实现方式的详细介绍。 ### MD5碰撞概述 MD5是一种基于哈希函数的消息摘要算法,其设计目标是将任意长度的数据映射成固定长度的128位散列值。然而,在实际应用中发现,通过特定技术可以找到两个不同的输入消息 \(M_1\) 和 \(M_2\) ,使得它们经过MD5计算后的输出相同,即满足条件 \(\text{MD5}(M_1) = \text{MD5}(M_2)\)[^2] 。这种现象被称为“强碰撞”。 #### 实现原理 为了制造这样的冲突情况,研究者们开发出了多种针对MD5的设计缺陷利用方法。这些方法主要依赖于差分路径分析技术和线性逼近理论来寻找可能引发内部状态变量变化最小化的比特模式组合[^3] 。 具体来说: - **差分路径构建**:通过对初始向量IV设定合理的偏移量,并结合精心挑选的消息扩展字序列,可以在一定程度上控制中间轮次运算结果之间的差异传播行为。 - **优化搜索策略**:采用遗传算法或者模拟退火等启发式寻优手段缩小候选解空间范围,从而加速有效碰撞实例生成过程中的迭代收敛速度。 ```python import hashlib def find_collision(): block_size = 64 # For simplicity, assuming single-block messages. prefix_message = b"A" * (block_size // 2) suffixes_to_test = [] for i in range(0x100): # Example search space size; adjust as needed. byte_value = bytes([i]) candidate_suffix = prefix_message + byte_value hash_obj = hashlib.md5() hash_obj.update(candidate_suffix) digest_hex = hash_obj.hexdigest() if not any(suffix['hash'].startswith(digest_hex[:len(prefix)]) \ and abs(len(suffix['data']) - len(candidate_suffix)) <= tolerance_threshold\ for suffix in suffixes_to_test): suffixes_to_test.append({'data':candidate_suffix,'hash':digest_hex}) return [(s1['data'], s2['data']) for idx,s1 in enumerate(suffixes_to_test[:-1]) for s2 in suffixes_to_test[idx+1:]] collision_pairs = find_collision() print(collision_pairs) ``` 上述代码片段展示了一个简化版的尝试检测潜在碰撞对的方法框架。需要注意的是,这仅用于教育目的演示如何编写程序逻辑结构;真实环境中成功执行此类操作需要更复杂的数学建模支持以及高性能计算资源投入。 ### 结论 综上所述,虽然理论上可以通过复杂的技术途径实现MD5碰撞攻击,但由于现代计算机性能提升加上新型高效算法不断涌现,目前大多数场景下已经不再推荐继续沿用安全性较低的传统加密机制如MD5作为唯一防护措施[^4] 。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值