MD5强碰撞
文章目录MD5简介MD5安全性MD5函数MD5碰撞原理练习—— [BJDCTF2020]Easy MD5MD5简介HASH函数,又称杂凑函数,是在信息安全领域有广泛和重要应用的密码算法,它有一种类似于指纹的应用。在网络安全协议中,杂凑函数用来处理电子签名,将冗长的签名文件压缩为一段独特的数字信息,像指纹鉴别身份一样保证原来数字签名文件的合法性和安全性。在前面提到的SHA-1和MD5都是目前最常用的
MD5简介
HASH函数,又称杂凑函数,是在信息安全领域有广泛和重要应用的密码算法,它有一种类似于指纹的应用。在网络安全协议中,杂凑函数用来处理电子签名,将冗长的签名文件压缩为一段独特的数字信息,像指纹鉴别身份一样保证原来数字签名文件的合法性和安全性。在前面提到的SHA-1和MD5都是目前最常用的杂凑函数。经过这些算法的处理,原始信息即使只更动一个字母,对应的压缩信息也会变为截然不同的“指纹”,这就保证了经过处理信息的唯一性。为电子商务等提供了数字认证的可能性。
MD5安全性
安全的杂凑函数在设计时必须满足两个要求:其一是寻找两个输入得到相同的输出值在计算上是不可行的,这就是我们通常所说的抗碰撞的;其二是找一个输入,能得到给定的输出在计算上是不可行的,即不可从结果推导出它的初始状态。现在使用的重要计算机安全协议,如SSL,PGP都用杂凑函数来进行签名,一旦找到两个文件可以产生相同的压缩值,就可以伪造签名,给网络安全领域带来巨大隐患。
MD5函数
MD5碰撞
原理
$md51 = md5('QNKCDZO');
$a = @$_GET['a'];
$md52 = @md5($a);
if(isset($a)){
if ($a != 'QNKCDZO' && $md51 == $md52) {
echo "nctf{*****************}";
} else {
echo "false!!!";
}
}
else{
echo "please input a";
}
首先,变量md51
的值是经过md5
加密的字符串QNKCDZO
,字符串QNKCDZO
经过md5
加密之后的值为:0e830400451993494058024219903391
。之后的变量a
,分析源代码可知,如果a
的值不为QNKCDZO
,并且md5
的值也为0e830400451993494058024219903391
,则会输出flag
。注意到判断md51
和md52
是否相等的时候,使用$md51 == $md52
,这里使用的是弱类型比较 ,也就是说md51
和md52
不需要完全相等。
弱类型比较规则:
0e
开头跟数字的字符串(例如"0e123
”)会当作科学计数法去比较,所以和0
相等;- “
0x
"开头跟数字的字符串(例如"0x1e240
”)会被当作16
进制数去比较; - 布尔值
true
和任意字符串都弱相等。 - 当比较的一方是字符串时,会先把其转换为数字,不能转换为数字的字符串(例如"
aaa
"是不能转换为数字的字符串而"123
"或"123aa
"或"0x10
"或"2e2
"就是可以转换为数字的字符串)或null
,被转换为0
。 12cdf
只取字符串中开头的整数部分,但是1e3dgf
这样的字符串在比较时,取的是符合科学计数法的部分:1e3
,也就是1000
。- 当有一个对比参数是整数的时候,会把另外一个参数强制转换为整数。
练习—— [BJDCTF2020]Easy MD5
- 打开题目,只有一个输入框,猜测是否为
sql
注入。 - 输入
1
,发现为get
请求,在开发者工具栏的中发现了该请求隐藏的hint
。 - 更加确信为
sql
注入,这句sql
语句中我们看到了关键是md5()
函数。
select * from 'admin' where password=md5($pass,true)
正向推算一下,要怎么得到我们要的答案。首先我们要找到一个字符串,这个字符串经过md5
得到的16位原始二进制的字符串能帮我们实现sql
注入。首先or
这个字符串是必要的,同时为了配对原先sql语句里面有的单引号,在or
的两边要有单引号,使它变成 password=‘xxx’or‘xxx’
的形式。
根据上面介绍的,or
对应的16进制是 276f7227
,所以我们的目标就是要找一个字符串取32位16进制的md5
值里带有276f7227
这个字段的,接着就是要看关键的数字部分了,在276f7227
这个字段后面紧跟一个数字,除了0,1-9,对应的ascil
码值是49-57
,转化为16进制就是31-39
,也就是我们需要有276f7227+(31-39)
这个字段,就可以满足要求。比如
xxxxxxxxxxxxxxxx276f7227(31-39)xxxxxx
最终得出密码为ffifdyop
,MD5加密为276f722736c95d99e921722cf9ed621c
。
4. 输入正确密码后,跳转到另外一个页面
5. 查看源码
$a = $GET['a'];
$b = $_GET['b'];
if($a != $b && md5($a) == md5($b)){ //弱类型比较
// wow, glzjin wants a girl friend.
- 在这里主要说采用中数组绕过【
md5
等函数不能处理数组,导致函数返回Null
。】
http://f17a0797-1a4a-4b35-88db-a45619d4b6f0.node4.buuoj.cn:81/levels91.php?a[]=1&b[]=2
注意:不要在php
后面添加斜杠
- 注意点击回车后会发生一次页面跳转(如果未发生,关闭
burp
或者hackbar
或者直接在url
处提交) - 提示使用
post
传参,即可得到flag
。
param1[]=1¶m2[]=2
练习—— [MRCTF2020]Ez_bypass
- 打开题目链接为一堆乱码,右键点击查看网页源码即可获得整齐的代码格式。
- 同样使用数组的方法绕过
md5
函数
http://bcc90956-e3b0-4c00-8a46-8d6efa259e60.node4.buuoj.cn:81?id[]=1&gg[]=2
is_numeric()
函数用1234567a
绕。1234567a
是字符串,但是弱比较的时候,1在前,php
会将其整体转成数字,就可以通过比较了。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)