首页 > 其他分享 >ctf中有关md5值绕过与碰撞

ctf中有关md5值绕过与碰撞

时间:2025-01-03 13:31:13浏览次数:3  
标签:FF -- GG ctf 哈希 绕过 md5 MD5

参考文献:
漫画:什么是MD5算法?摘要哈希生成的正确姿势是什么样呢?
PHP中MD5函数漏洞总结 - 知乎
成理信安协会反序列化01-利用fastcoll实现md5碰撞 - Riv3r1and - 博客园
PHP md5 相等绕过 - Ainsliaea - 博客园

文章目录


前言

MD5(Message-Digest Algorithm 5)是一种广泛使用的加密哈希函数,它可以产生一个128位(16字节)的哈希值。MD5由Ron Rivest在1991年设计,最初被用来作为一种安全的密码散列算法,用于确保信息传输完整一致。然而,由于后来发现MD5存在安全漏洞,它不再被推荐用于需要高安全性的场合,比如数字签名和密码存储。


一、md5算法

MD5算法底层原理

简单概括起来,MD5算法的过程分为四步:处理原文设置初始值循环加工,拼接结果

第一步:处理原文

首先,我们计算出原文长度(bit)对512求余的结果,如果不等于448,就需要填充原文使得原文对512求余的结果等于448。填充的方法是第一位填充1,其余位填充0。填充完后,信息的长度就是512N+448。
之后,用剩余的位置(512-448=64位)记录原文的真正长度,把长度的二进制值补在最后。这样处理后的信息长度就是512
(N+1)。

第二步:设置初始值

MD5的哈希结果长度为128位,按每32位分成一组共4组。这4组结果是由4个初始值A、B、C、D经过不断演变得到。MD5的官方实现中,A、B、C、D的初始值如下(16进制):
A=0x01234567
B=0x89ABCDEF
C=0xFEDCBA98
D=0x76543210

第三步:循环加工

这一步是最复杂的一步,我们看看下面这张图,此图代表了单次A,B,C,D值演变的流程。

请添加图片描述
主循环中的64次子循环,可以归纳为下面的四部分:

   **第一轮:**

   FF(a,b,c,d,M0,7,0xd76aa478)     s[0]=7,   K[0] = 0xd76aa478

FF(a,b,c,d,M1,12,0xe8c7b756) s[1]=12, K[1] = 0xe8c7b756

FF(a,b,c,d,M2,17,0x242070db)

FF(a,b,c,d,M3,22,0xc1bdceee)

FF(a,b,c,d,M4,7,0xf57c0faf)

FF(a,b,c,d,M5,12,0x4787c62a)

FF(a,b,c,d,M6,17,0xa8304613)

FF(a,b,c,d,M7,22,0xfd469501)

FF(a,b,c,d,M8,7,0x698098d8)

FF(a,b,c,d,M9,12,0x8b44f7af)

FF(a,b,c,d,M10,17,0xffff5bb1)

FF(a,b,c,d,M11,22,0x895cd7be)

FF(a,b,c,d,M12,7,0x6b901122)

FF(a,b,c,d,M13,12,0xfd987193)

FF(a,b,c,d,M14,17, 0xa679438e)

FF(a,b,c,d,M15,22,0x49b40821)

第二轮:

GG(a,b,c,d,M1,5,0xf61e2562)

GG(a,b,c,d,M6,9,0xc040b340)

GG(a,b,c,d,M11,14,0x265e5a51)

GG(a,b,c,d,M0,20,0xe9b6c7aa)

GG(a,b,c,d,M5,5,0xd62f105d)

GG(a,b,c,d,M10,9,0x02441453)

GG(a,b,c,d,M15,14,0xd8a1e681)

GG(a,b,c,d,M4,20,0xe7d3fbc8)

GG(a,b,c,d,M9,5,0x21e1cde6)

GG(a,b,c,d,M14,9,0xc33707d6)

GG(a,b,c,d,M3,14,0xf4d50d87)

GG(a,b,c,d,M8,20,0x455a14ed)

GG(a,b,c,d,M13,5,0xa9e3e905)

GG(a,b,c,d,M2,9,0xfcefa3f8)

GG(a,b,c,d,M7,14,0x676f02d9)

GG(a,b,c,d,M12,20,0x8d2a4c8a)

第三轮:

HH(a,b,c,d,M5,4,0xfffa3942)

HH(a,b,c,d,M8,11,0x8771f681)

HH(a,b,c,d,M11,16,0x6d9d6122)

HH(a,b,c,d,M14,23,0xfde5380c)

HH(a,b,c,d,M1,4,0xa4beea44)

HH(a,b,c,d,M4,11,0x4bdecfa9)

HH(a,b,c,d,M7,16,0xf6bb4b60)

HH(a,b,c,d,M10,23,0xbebfbc70)

HH(a,b,c,d,M13,4,0x289b7ec6)

HH(a,b,c,d,M0,11,0xeaa127fa)

HH(a,b,c,d,M3,16,0xd4ef3085)

HH(a,b,c,d,M6,23,0x04881d05)

HH(a,b,c,d,M9,4,0xd9d4d039)

HH(a,b,c,d,M12,11,0xe6db99e5)

HH(a,b,c,d,M15,16,0x1fa27cf8)

HH(a,b,c,d,M2,23,0xc4ac5665)

第四轮:

Ⅱ(a,b,c,d,M0,6,0xf4292244)

Ⅱ(a,b,c,d,M7,10,0x432aff97)

Ⅱ(a,b,c,d,M14,15,0xab9423a7)

Ⅱ(a,b,c,d,M5,21,0xfc93a039)

Ⅱ(a,b,c,d,M12,6,0x655b59c3)

Ⅱ(a,b,c,d,M3,10,0x8f0ccc92)

Ⅱ(a,b,c,d,M10,15,0xffeff47d)

Ⅱ(a,b,c,d,M1,21,0x85845dd1)

Ⅱ(a,b,c,d,M8,6,0x6fa87e4f)

Ⅱ(a,b,c,d,M15,10,0xfe2ce6e0)

Ⅱ(a,b,c,d,M6,15,0xa3014314)

Ⅱ(a,b,c,d,M13,21,0x4e0811a1)

Ⅱ(a,b,c,d,M4,6,0xf7537e82)

Ⅱ(a,b,c,d,M11,10,0xbd3af235)

Ⅱ(a,b,c,d,M2,15,0x2ad7d2bb)

Ⅱ(a,b,c,d,M9,21,0xeb86d391)

第四步:拼接结果

把循环加工最终产生的A,B,C,D四个值拼接在一起,转换成字符串即可

MD5全名消息摘要算法(Message-Digest Algorithm 5),是一种密码散列函数,可以产生一个128位(16字节)的哈希值(hash value),用于确保信息传输的完整一致性,它的基础原理就是将数据预算变为另一固定长度的值
Md5的特点:

  • 长度一致性:任意长度的数据,计算出来的哈希值长度都是固定的128位

  • 不对称性:从原数据计算哈希值十分容易,但是知道哈希值去碰撞原数据十分困难

二、md5值相等绕过原理

0E开头的哈希值被解释为0的原理主要涉及到PHP在处理字符串时的一个特性。当PHP遇到以“0E”开头的字符串时,它会将这个字符串解释为科学计数法,即0的n次方,结果为0。这个特性在哈希值比较中被利用,特别是在弱比较(使用==)的情况下

具体来说,当两个不同的字符串经过哈希(如MD5)后得到的哈希值都是以“0E”开头时,PHP会将这两个哈希值都视为0,因此在比较时会认为它们是相等的。这种现象仅在弱比较时发生,因为弱比较会先将字符串转换为数值再进行比较,而强比较(使用===)会检查数据类型是否相等,所以不会受到这种影响

基本的原理是这样的,但更严谨的字符串格式是,0e 开头,同时后面都是数字,不能包含其他字符的字符串,md5 值才会相等(== 的结果为 True,但 === 的结果为 False)。

例如,如果有两个字符串QNKCDZO240610708,它们经过MD5哈希后得到的值都是以“0E”开头的,那么在PHP中使用==进行比较时,这两个哈希值会被认为是相等的,因为它们都被解释为0,从而实现一些绕过。这种原理在安全测试和CTF(Capture The Flag)比赛中被用来绕过一些基于哈希的比较逻辑

$a="240610708";

$b="QNKCDZO";

print($a . "-->" .md5($a) . "<br>");

print($b . "-->" .md5($b) . "<br>");

print(var_dump(md5($a) == md5($b)) . "<br>");

//240610708-->0e462097431906509019562988736854

//QNKCDZO-->0e830400451993494058024219903391

//bool(true)

//数字 数字

$a2="0e333";

$b2="0e555";

print($a2 . "-->" .md5($a2) . "<br>");

print($b2 . "-->" .md5($b2) . "<br>");

print(var_dump(md5($a2) == md5($b2)) . "<br>");

//0e333-->2bbee9c20a868d103eaf388f725e8c26

//0e555-->edea6647adc378400db9dbfc188db352

//bool(false)

//数字  字母

$a3="0eadd";

$b3="0e232";

print($a3 . "-->" .md5($a3) . "<br>");

print($b3 . "-->" .md5($b3) . "<br>");

print(var_dump(md5($a3) == md5($b3)) . "<br>");

//0eadd-->462db0a6aa4fb97ae01a07cf43b0ab9a

//0e232-->0270fbf859a980233782ba13539733da

//bool(false)

//数字 vs 数字/字母

$a4="s155964671a";

$b4="s1665632922a";

print($a4 . "-->" .md5($a4) . "<br>");

print($b4 . "-->" .md5($b4) . "<br>");

print(var_dump(md5($a4) == md5($b4)) . "<br>");

//s155964671a-->0e342768416822451524974117254469

//s1665632922a-->0e731198061491163073197128363787

//bool(true)

常见的md5值是0e开头的且后面均为数字的字符串

//数字字母
s878926199a 0e545993274517709034328855841020 
s155964671a 0e342768416822451524974117254469 
s214587387a 0e848240448830537924465865611904 
s214587387a 0e848240448830537924465865611904 
s878926199a 0e545993274517709034328855841020 
s1091221200a 0e940624217856561557816327384675 
s1885207154a 0e509367213418206700842008763514 
s1502113478a 0e861580163291561247404381396064 
s1885207154a 0e509367213418206700842008763514 
s1836677006a 0e481036490867661113260034900752 
s155964671a 0e342768416822451524974117254469 
s1184209335a 0e072485820392773389523109082030 
s1665632922a 0e731198061491163073197128363787 
s1502113478a 0e861580163291561247404381396064 
s1836677006a 0e481036490867661113260034900752 
s1091221200a 0e940624217856561557816327384675 
s155964671a 0e342768416822451524974117254469 
s1502113478a 0e861580163291561247404381396064 
s155964671a 0e342768416822451524974117254469 
s1665632922a 0e731198061491163073197128363787 
s155964671a 0e342768416822451524974117254469 
s1091221200a 0e940624217856561557816327384675 
s1836677006a 0e481036490867661113260034900752 
s1885207154a 0e509367213418206700842008763514 
s532378020a 0e220463095855511507588041205815 
s878926199a 0e545993274517709034328855841020 
s1091221200a 0e940624217856561557816327384675 
s214587387a 0e848240448830537924465865611904 
s1502113478a 0e861580163291561247404381396064 
s1091221200a 0e940624217856561557816327384675 
s1665632922a 0e731198061491163073197128363787 
s1885207154a 0e509367213418206700842008763514 
s1836677006a 0e481036490867661113260034900752 
s1665632922a 0e731198061491163073197128363787 
s878926199a 0e545993274517709034328855841020 
//数字
240610708 0e462097431906509019562988736854 
314282422 0e990995504821699494520356953734 
571579406 0e972379832854295224118025748221 
903251147 0e174510503823932942361353209384 
1110242161 0e435874558488625891324861198103 
1320830526 0e912095958985483346995414060832 
1586264293 0e622743671155995737639662718498 
2302756269 0e250566888497473798724426794462 
2427435592 0e067696952328669732475498472343 
2653531602 0e877487522341544758028810610885 
3293867441 0e471001201303602543921144570260 
3295421201 0e703870333002232681239618856220 
3465814713 0e258631645650999664521705537122 
3524854780 0e507419062489887827087815735195 
3908336290 0e807624498959190415881248245271 
4011627063 0e485805687034439905938362701775 
4775635065 0e998212089946640967599450361168 
4790555361 0e643442214660994430134492464512 
5432453531 0e512318699085881630861890526097 
5579679820 0e877622011730221803461740184915 
5585393579 0e664357355382305805992765337023 
6376552501 0e165886706997482187870215578015 
7124129977 0e500007361044747804682122060876 
7197546197 0e915188576072469101457315675502 
7656486157 0e451569119711843337267091732412 
//字母
QLTHNDT 0e405967825401955372549139051580 
QNKCDZO 0e830400451993494058024219903391 
EEIZDOI 0e782601363539291779881938479162 
TUFEPMC 0e839407194569345277863905212547 
UTIPEZQ 0e382098788231234954670291303879 
UYXFLOI 0e552539585246568817348686838809 
IHKFRNS 0e256160682445802696926137988570 
PJNPDWY 0e291529052894702774557631701704 
ABJIHVY 0e755264355178451322893275696586 
DQWRASX 0e742373665639232907775599582643 
DYAXWCA 0e424759758842488633464374063001 
GEGHBXL 0e248776895502908863709684713578 
GGHMVOE 0e362766013028313274586933780773 
GZECLQZ 0e537612333747236407713628225676 
NWWKITQ 0e763082070976038347657360817689 
NOOPCJF 0e818888003657176127862245791911 
MAUXXQC 0e478478466848439040434801845361 
MMHUWUV 0e701732711630150438129209816536

例题,ctfshow,web5

请添加图片描述

代码分析:设置三个变量用GET进行传参,isset() 函数判断v1和v2是否填写,是否只包含字母。如果不是,脚本会终止并输出 “v1 error”,v2 是否是一个数字,如果v2不是数字,结束error,如果v1和v2的MD5哈希值相等,则打印flag,否则返回where is flag?
hackbar一把梭哈
请添加图片描述
请添加图片描述

三、数组绕过(PHP8无法绕过)

在php5和php7中,当两个md5进行比较时,若参数是不同的数组,那么=比较结果均为true

print_r(PHP_VERSION . "<br>");

$a5 = $_GET["a"];

$b5 = $_GET["b"];

print_r($a5 . "<br>");

print_r($b5 . "<br>");

print_r(var_dump(md5($a5) === md5($b5)));

请添加图片描述
请添加图片描述
请添加图片描述
当满足条件时,由于PHP中MD5函数的特性,可以使用数组绕过

$_POST['param1']!==$_POST['param2'] && md5($_POST['param1'])===md5($_POST['param2']);
md5([1,2]) == md5([3,4]) == NULL

只要GET方法传入a[]=1&b[]=2即可绕过

四、md5碰撞

MD5碰撞的原理基于MD5算法的安全性漏洞,特别是其抗碰撞性的不足。MD5算法是一种广泛使用的哈希函数,它将输入数据转换为一个128位的哈希值。然而,MD5算法在设计上存在缺陷,这使得它容易受到碰撞攻击,即可以找到两个不同的输入,它们产生相同的哈希值。这种碰撞攻击的实现依赖于MD5算法的内部结构和特性。

MD5算法将输入数据划分为64字节的块,然后在这些块上迭代计算哈希。算法的核心是一个压缩函数,它接受两个输入,一个64字节的数据块和上一次迭代的结果。压缩函数产生一个128位的IHV(Intermediate Hash Value,中间散列值),然后将该输出发送到下一次迭代中。如果当前迭代是最后一次迭代,则IHV将是最终的哈希值。给定两个输入M和N,如果MD5(M) = MD5(N),则对于任何输入T,MD5(M||T) = MD5(N||T),因为M和N产生的IHV一样,这是前面的数据唯一影响最终哈希值的部分。

MD5碰撞的实现通常涉及到对算法的深入理解和精心设计的攻击策略。例如,可以使用fastcoll工具对给定的前缀快速生成MD5碰撞,即生成两个不同的文件,每个文件都是在给定的内容后面附加一段东西生成的。这种方法可以用于验证MD5算法的碰撞漏洞,并展示如何利用这些漏洞。

此外,MD5算法的碰撞攻击还涉及到对算法的填充、初始化、处理信息和输出结果等步骤的详细分析。尽管MD5算法在设计之初被广泛应用且被认为是安全的哈希函数,但随着计算技术的发展,现已被证明存在一定的安全性问题,特别是其碰撞攻击逐渐成为可能,导致其安全性受到挑战。

下载:http://www.win.tue.nl/hashclash/fastcoll_v1.0.0.5.exe.zip

源码:http://www.win.tue.nl/hashclash/fastcoll_v1.0.0.5_source.zip

相关内容:Marc Stevens - 研究 — Marc Stevens - Research

基本用法

  1. 查看帮助信息
    你可以直接运行程序而不带任何参数,或者使用 -h--help 来查看帮助信息
  2. 设置输出文件名
    使用 -o--output 选项来指定输出文件名。这是必需的,并且必须是命令行上的最后一个选项。你需要指定两个文件名,这两个文件将包含生成的碰撞消息。
  fastcoll_v1.0.0.5.exe -o output1.bin output2.bin
  1. 使用指定的初始值
    如果你想使用一个特定的初始值而不是默认的 MD5 初始值,可以使用 -i--ihv 选项后跟你想要设置的初始值
  fastcoll_v1.0.0.5.exe -i 0x12345678 -o output1.bin output2.bin
  1. 使用前缀文件
    如果你有一个前缀文件,并且想要基于这个前缀文件来计算初始值,可以使用 -p--prefixfile 选项。
   fastcoll_v1.0.0.5.exe -p prefixfile.txt -o output1.bin output2.bin
  1. 减少输出信息
    如果你不想看到程序运行时的详细信息,可以使用 -q--quiet 选项来减少输出。
   fastcoll_v1.0.0.5.exe -q -o output1.bin output2.bin
  1. 组合选项
    你可以组合使用这些选项来满足你的需求。例如,如果你想要使用一个前缀文件,并且减少输出信息,可以这样做
  fastcoll_v1.0.0.5.exe -p prefixfile.txt -q -o output1.bin output2.bin

举个栗子

文件下载地址:
Hello world
Goodbye world
请添加图片描述
请添加图片描述

使用 certutil 命令查看一下md5,md5值相同
请添加图片描述
然后我们看一下SHA1的结果,两个文件的SHA1值不一样,是没有问题的
请添加图片描述

标签:FF,--,GG,ctf,哈希,绕过,md5,MD5
From: https://blog.csdn.net/2301_81684021/article/details/144907940

相关文章

  • 2025如何在CTF比赛中取得名次?零基础必看
    在CTF(CaptureTheFlag)比赛中取得好名次,关键在于系统化的学习与实践。下面是提升CTF比赛能力的一些建议和策略:1.基础知识的扎实积累CTF学习路线&工具及题型解析等籽料我已经给大家整理好了,【点这里自取即可】在CTF比赛中,掌握相关基础知识至......
  • 2025如何在CTF比赛中取得名次?零基础必看
    在CTF(CaptureTheFlag)比赛中取得好名次,关键在于系统化的学习与实践。下面是提升CTF比赛能力的一些建议和策略:1.基础知识的扎实积累CTF学习路线&工具及题型解析等籽料我已经给大家整理好了,【点这里自取即可】在CTF比赛中,掌握相关基础知识至关......
  • 2025如何在CTF比赛中取得名次?零基础必看
    在CTF(CaptureTheFlag)比赛中取得好名次,关键在于系统化的学习与实践。下面是提升CTF比赛能力的一些建议和策略:1.基础知识的扎实积累CTF学习路线&工具及题型解析等籽料我已经给大家整理好了,【点这里自取即可】在CTF比赛中,掌握相关基础知识至关......
  • 2025如何在CTF比赛中取得名次?零基础必看
    在CTF(CaptureTheFlag)比赛中取得好名次,关键在于系统化的学习与实践。下面是提升CTF比赛能力的一些建议和策略:1.基础知识的扎实积累CTF学习路线&工具及题型解析等籽料我已经给大家整理好了,【点这里自取即可】在CTF比赛中,掌握相关基础知识至关重......
  • 零基础被迫参加CTF比赛?CTF高频解题技巧与经验分享
    CTF(CaptureTheFlag)比赛中的高频解题技巧通常涵盖了以下几类技术,涉及从逆向工程、二进制漏洞利用到Web安全、密码学等多个领域。以下是一些高频解题技巧:1.逆向工程(ReverseEngineering)静态分析:通过阅读二进制文件的源代码或反编译代码(如使用......
  • 零基础被迫参加CTF比赛?CTF高频解题技巧与经验分享
    CTF(CaptureTheFlag)比赛中的高频解题技巧通常涵盖了以下几类技术,涉及从逆向工程、二进制漏洞利用到Web安全、密码学等多个领域。以下是一些高频解题技巧:1.逆向工程(ReverseEngineering)静态分析:通过阅读二进制文件的源代码或反编译代码(如使用......
  • CTF学习法则——寒假篇 新手赶快收藏吧!
    CTF(CapturetheFlag)是网络安全领域中的一种比赛形式,涵盖了漏洞利用、逆向工程、加密解密、编码解码等多方面的技术,参与者通过解决难题(称为“Flag”)获得积分。对于想要在寒假期间提升CTF技能的同学们,以下是一些有效的学习法则,可以帮助你高效地进行学习和提升:1.......
  • CTF学习法则——寒假篇 新手赶快收藏吧!
    CTF(CapturetheFlag)是网络安全领域中的一种比赛形式,涵盖了漏洞利用、逆向工程、加密解密、编码解码等多方面的技术,参与者通过解决难题(称为“Flag”)获得积分。对于想要在寒假期间提升CTF技能的同学们,以下是一些有效的学习法则,可以帮助你高效地进行学习和提升:1.......
  • CTF学习法则——寒假篇 新手赶快收藏吧!
    CTF(CapturetheFlag)是网络安全领域中的一种比赛形式,涵盖了漏洞利用、逆向工程、加密解密、编码解码等多方面的技术,参与者通过解决难题(称为“Flag”)获得积分。对于想要在寒假期间提升CTF技能的同学们,以下是一些有效的学习法则,可以帮助你高效地进行学习和提升:1.合......
  • 2025年全国CTF夺旗赛-从零基础入门到竞赛,看这一篇就稳了!
    ......