MD5强碰撞

MD5简介

HASH函数,又称杂凑函数,是在信息安全领域有广泛和重要应用的密码算法,它有一种类似于指纹的应用。在网络安全协议中,杂凑函数用来处理电子签名,将冗长的签名文件压缩为一段独特的数字信息,像指纹鉴别身份一样保证原来数字签名文件的合法性和安全性。在前面提到的SHA-1和MD5都是目前最常用的杂凑函数。经过这些算法的处理,原始信息即使只更动一个字母,对应的压缩信息也会变为截然不同的“指纹”,这就保证了经过处理信息的唯一性。为电子商务等提供了数字认证的可能性。

MD5安全性

安全的杂凑函数在设计时必须满足两个要求:其一是寻找两个输入得到相同的输出值在计算上是不可行的,这就是我们通常所说的抗碰撞的;其二是找一个输入,能得到给定的输出在计算上是不可行的,即不可从结果推导出它的初始状态。现在使用的重要计算机安全协议,如SSL,PGP都用杂凑函数来进行签名,一旦找到两个文件可以产生相同的压缩值,就可以伪造签名,给网络安全领域带来巨大隐患。

MD5函数

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。注意到判断md51md52是否相等的时候,使用$md51 == $md52,这里使用的是弱类型比较 ,也就是说md51md52不需要完全相等。

弱类型比较规则:

  • 0e开头跟数字的字符串(例如"0e123”)会当作科学计数法去比较,所以和0相等;
  • 0x"开头跟数字的字符串(例如"0x1e240”)会被当作16进制数去比较;
  • 布尔值true和任意字符串都弱相等。
  • 当比较的一方是字符串时,会先把其转换为数字,不能转换为数字的字符串(例如"aaa"是不能转换为数字的字符串而"123"或"123aa"或"0x10"或"2e2"就是可以转换为数字的字符串)或null,被转换为0
  • 12cdf只取字符串中开头的整数部分,但是1e3dgf这样的字符串在比较时,取的是符合科学计数法的部分:1e3,也就是1000
  • 当有一个对比参数是整数的时候,会把另外一个参数强制转换为整数。

常见的MD5碰撞:md5值为0e开头

练习—— [BJDCTF2020]Easy MD5

  1. 打开题目,只有一个输入框,猜测是否为sql注入。
  2. 输入1,发现为get请求,在开发者工具栏的中发现了该请求隐藏的hint在这里插入图片描述
  3. 更加确信为sql注入,这句sql语句中我们看到了关键是md5()函数。
select * from 'admin' where password=md5($pass,true)

正向推算一下,要怎么得到我们要的答案。首先我们要找到一个字符串,这个字符串经过md5得到的16位原始二进制的字符串能帮我们实现sql注入。首先or这个字符串是必要的,同时为了配对原先sql语句里面有的单引号,在or的两边要有单引号,使它变成 password=‘xxx’or‘xxx’ 的形式。

在线字符串和16进制互转

根据上面介绍的,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.
  1. 在这里主要说采用中数组绕过【md5等函数不能处理数组,导致函数返回Null。】
http://f17a0797-1a4a-4b35-88db-a45619d4b6f0.node4.buuoj.cn:81/levels91.php?a[]=1&b[]=2    

注意:不要在php后面添加斜杠在这里插入图片描述

  1. 注意点击回车后会发生一次页面跳转(如果未发生,关闭burp或者hackbar或者直接在url处提交)
  2. 提示使用post传参,即可得到flag
param1[]=1&param2[]=2

在这里插入图片描述

练习—— [MRCTF2020]Ez_bypass

  1. 打开题目链接为一堆乱码,右键点击查看网页源码即可获得整齐的代码格式。
    在这里插入图片描述
  2. 同样使用数组的方法绕过md5函数
http://bcc90956-e3b0-4c00-8a46-8d6efa259e60.node4.buuoj.cn:81?id[]=1&gg[]=2
  1. is_numeric()函数用1234567a绕。1234567a是字符串,但是弱比较的时候,1在前,php会将其整体转成数字,就可以通过比较了。在这里插入图片描述
  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

poggioxay

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

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

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

打赏作者

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

抵扣说明:

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

余额充值