CTF中关于md5的一些总结
前言
最近打了挺多ctf,碰到挺多关于md5的一些问题,或者一些变种的题目,虽然已经是烂大街的问题了,但是还是需要总结一下,方便下次比赛可以直接用脚本
CTF中的一些案例
案例1——ciscn2020初赛——easytrick
1 |
|
这里我们抛开反序列化不谈,这题本质上需要我们构造trick1=NAN
,trick2=NAN
即可绕过。原理也很简单,NaN与所有值都不相等,包括它自己。当然也可以用INF绕过,原理类似,这里不过多赘述
案例2——强网杯2020——Funhash
1 |
|
这里重点关注level 1
,其他两关都是老生常谈的东西,无须过多赘述。这里我已经写好了脚本,下次遇到这种md4
的题目直接爆破干它
下面给出我已经爆破好的例子:
1 | 0e251288019 |
exp.php
1 |
|
案例3——NJUPT2019南邮校赛——easyphp
这里我截取了一部分代码,用作案例讲解
1 | $string_1 = $_GET['str1']; |
这里的关键就是,需要我们找两个个是ce
开头的,然后ce
后面是纯数字的md5值
下面给出我已经爆破好的例子:
1 | N9KU3 |
爆破的脚本如下
exp.py
1 | import string |
案例4——双MD5碰撞绕过
1 |
|
这里其实我们只要找出md5(md5($b))
是0e
开头的且0e
后面是纯数字的字符串即可
下面给出我已经爆破好的例子:
1 | f2WfQ |
爆破脚本如下:
exp.py
1 | import string |
案例5——php中md5($str,true)注入
1 |
|
这里md5输出的是16 字符二进制格式,并不是我们平时看到的32字符十六进制数,所以我们只需要找md5加密后字符串中是否存在'or'
字符串
下面给出我已经爆破好的例子:
1 | ffifdyop |
exp.php
1 |
|
案例6——强网杯2018——Web 签到
这里选取了部分代码,用作演示
1 |
|
这里因为对两个参数都进行了强制类型转换,所以一般的方法(用数组报错绕过肯定是行不通的了),所以我们必须找到两个文件,他们的内容不一样,但是md5值相等
在网上找到两张图片,他们内容不一样,但是md5值一样
exp.py
1 | # -*- coding: utf-8 -*- |
案例7——md5($a)与md5(md5($a))都是0e开头的字符串
下面给出我已经爆破好的例子:
1 |
exp.py
1 | import string |
拓展
三张图片碰撞
在上个案例中,只是两张图片碰撞。这里我们思考一个问题,如果是三张图片呢,是否存在?答案是存在的
两个其他类型的文件md5碰撞
首先下载hashclash,如果是linux环境的话可以下载编译好的二进制文件,如果是macos系统的话,就需要下载源码,然后自行编译,编译成功如下:
创建目录
1 | mkdir ipc_workdir |
运行脚本
1 | echo -n "TEST" > prefix.txt |
稍等片刻后,就可以碰撞出来了
php文件的md5碰撞
下载文件:
1 | wget https://s3-eu-west-1.amazonaws.com/md5collisions/a.php |
How I made two PHP files with the same MD5 hash
sha1碰撞
下载文件
1 | curl -sSO https://shattered.it/static/shattered-1.pdf |
任意多个文件,文件内容不同,md5值相同
运用的原理如下:
1 | MD5(file + col1_a + col2_a) === MD5(file + col1_a + col2_b) === MD5(file + col1_b + col2_a) === MD5(file + col1_b + col2_b) |
这里使用的工具还是hashclash
我们在在hashclash文件夹下创建工作目录,然后执行下面的shell脚本
gen.sh
1 | ../bin/md5_fastcoll test.txt -o test_1.txt test_2.txt |
genfiles.py
1 | with open("test.txt","rb") as f: |
这样就可以生成6个文件内容不同,但是它们的md5都相同,事实上,你可以生成任意多个
总结
其实很多题目都是类似的,需要我们自己动手写脚本,本质上就是去找hash加密后的字符串前两位是0e
,后30位是纯数字的,只要会写脚本,就是万变不离其宗