md5强弱碰撞(HECTF ezphp)

很惭愧,学了这么久才领会到md5碰撞
参考网站:浅谈md5碰撞

先区分一下==,====以及 ===的区别

== ,====表示弱类型比较:
==,====在进行比较的时候,如果比较一个数字和字符串或者比较涉及到数字内容的字符串,则字符串会被转换为数值并且比较按照数值来进行

这种情况比较md5时,传入md5后0e开头的字符串或者传入数组即可

===表示强类型比较:
===在进行比较的时候,会先判断两种字符串的类型是否相等,再比较内容。

强碰撞比较时,同样可以传入数组,但是不能传入md5后存在0e但是不完全相等的值

无论强弱类型碰撞,都可以输入数组绕过,如a[]=1&b[]=1

还可以采用以下办法

下载fastcoll

使用命令产生两个不一样但是md5加密后是一样的文件,可以传递url加密后不同的这两个参数,但是md5后完全相同,符合===强碰撞的条件

fastcoll_v1.0.0.5.exe -p ywj.txt -o 1.txt 2.txt

在这里插入图片描述在这里插入图片描述

<?php 
function  readmyfile($path){
    $fh = fopen($path, "rb");
    $data = fread($fh, filesize($path));
    fclose($fh);
    return $data;
}
echo "二进制md5加密:  ". md5( (readmyfile("1.txt")));
echo "\n";echo "\n";
echo  'url编码: '. urlencode(readmyfile("1.txt"));
echo "\n";echo "\n";
echo '二进制md5加密: '.md5( (readmyfile("2.txt")));
echo "\n";echo "\n";
echo  'url编码: '.  urlencode(readmyfile("2.txt"));

上题目

<?php 
error_reporting(0);
highlight_file(__file__);
include('flag.php'); 
$string_1 = $_GET['str1']; 
$string_2 = $_GET['str2']; 

if($_GET['param1']!==$_GET['param2']&&md5($_GET['param1'])===md5($_GET['param2'])){
        if(is_numeric($string_1)){ 
            $md5_1 = md5($string_1); 
            $md5_2 = md5($string_2); 
            if($md5_1 != $md5_2){ 
                $a = strtr($md5_1, 'cxhp', '0123'); 
                $b = strtr($md5_2, 'cxhp', '0123'); 
                if($a == $b){
                    echo $flag;
                }
            }  
            else {
               die("md5 is wrong"); 
            }
            } 
        else {
        die('str1 not number'); 
        }
    }

?>

再来看下本题:

if($_GET['param1']!==$_GET['param2']&&md5($_GET['param1'])===md5($_GET['param2']))

传入四个参数:param1,param2,str1以及str2,首先对param1与param2判断是否相等,再进行md5强碰撞比较,此时可以传入数组或者是利用工具生成的字符串,即可绕过

对于str1和str2,首先md5后不能相等,经过md5后,strstr函数替换后,两者又要相等(弱类型)

a = s t r t r ( a = strtr( a=strtr(md5_1, ‘cxhp’, ‘0123’);
strstr函数:表示将字符串中任意包含cxhp字符替换为0123,即c被替换成了0

那么就可以知道,可以传入两个md5后开头两个数为ce的数,或者传入一个MD5后0e开头,一个MD5后ce开头的数

<?php
for($a = 1; $a <= 100000000; $a++) {
   $md5 = strtr(md5($a),'cxhp', '0123');
   if(preg_match('/^0e\d+$/', $md5)) {     //得到MD5后ce,或者oe开头的数
      echo $a;
      echo "\n";
      echo $md5;
      echo "\n";
   }
}
?>

在这里插入图片描述得到flag
在这里插入图片描述

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

YnG_t0

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

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

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

打赏作者

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

抵扣说明:

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

余额充值