iis服务器助手广告
返回顶部
  • 844
分享到

MD5碰撞

php开发语言web安全 2023-09-08 19:09:41 844人浏览 泡泡鱼
摘要

前言: 在CTF中可以说是经常碰到md5加密了,一般都是进行强比较抑或是弱比较,考法非常多,但是万变不离其中。只要我们掌握了原理,一切问题便迎刃而解了。 文章首发于 我的博客 ,格式可能比较清晰,有兴趣了解CTF中MD5碰撞的伙伴可以移步

前言:

在CTF中可以说是经常碰到md5加密了,一般都是进行强比较抑或是弱比较,考法非常多,但是万变不离其中。只要我们掌握了原理,一切问题便迎刃而解了。

文章首发于 我的博客 ,格式可能比较清晰,有兴趣了解CTF中MD5碰撞的伙伴可以移步查看

简单了解MD5:

  • md5是一种加密算法,并且不能防止碰撞破解
  • md5加密是不可逆的,这就意味着有两串不同的字符串加密出来的内容却是相同的
  • 加密过程简单,碰撞还原字符难

PHP的弱比较:

先提两个例子:

var_dump("123a"==123)

var_dump("123a"=="123")

在没有认真总结前,完全不知道弱比较还要区分字符串类型比较还是与int类型比较

上述实例的结果是:

True

False

字符串与int类型比较:

php规定当进行字符串与数字的弱比较时,会进行如下步骤

先看字符串开头是否为数字,如果为数字,则截止到连续数字的最后一个数字,即"123abc456"=>123

如果开头不为数字,则判断为false,即0。因此

("aaa123"==0) =>true

("123a"==123) =>true

思维导图:

字符串与字符串比较:

正如上面所言:

var_dump("123a"=="123"); //False

因为这个是字符串之间进行比较,想要绕过这个弱比较只能用0e的方式。

在PHP中"0e"判断为科学计数法,0e123就是0的10123次方

不难推出:0e123456789==0e1 // 因为0的任意次方都为0

不过有一个注意点:

"0e123456"=="0e345" //True

"0e12adfc"=="0e345" //False

在0e后面不能含有字母!!!

在0e后面不能含有字母!!!

在0e后面不能含有字母!!!

否则判断为False

#实例

if("0e23253"=="0e2345")

{

echo 'yes';

}

?>

输出:

yes

CTF的MD5弱比较

在CTF中,会遇到如下的MD5弱比较题目

1.md5($a)==md5($b) & $a != $b

这个时候就要利用0e的形式来解题,找到两个不同字符,md5加密后却都是0e324234的形式。如何寻找这样的字符串?

1.脚本寻找

# -*- coding: utf-8 -*-import multiprocessingimport hashlibimport randomimport stringimport sysCHARS = string.ascii_letters + string.digitsdef cmp_md5(substr, stop_event, str_len, start=0, size=20):    global CHARS    while not stop_event.is_set():        rnds = ''.join(random.choice(CHARS) for _ in range(size))        md5 = hashlib.md5(rnds)        value = md5.hexdigest()        if value[start: start + str_len] == substr:            # print rnds            # stop_event.set()            # 碰撞双md5            md5 = hashlib.md5(value)            if md5.hexdigest()[start: start + str_len] == substr:                print rnds + "=>" + value + "=>" + md5.hexdigest() + "\n"                stop_event.set()if __name__ == '__main__':    substr = sys.argv[1].strip()    start_pos = int(sys.argv[2]) if len(sys.argv) > 1 else 0    str_len = len(substr)    cpus = multiprocessing.cpu_count()    stop_event = multiprocessing.Event()    processes = [multiprocessing.Process(target=cmp_md5, args=(substr,       stop_event, str_len, start_pos))                 for i in range(cpus)]    for p in processes:        p.start()    for p in processes:        p.join()

用法:

输入命令

python md5.py "0e" 0

"0e" =>要跑的字符

0 =>要跑的字符的起始位置

脚本寻找要浪费大概十分钟左右的时间才能找出一个,可以用网上现成的,如果题目要求比较特殊的话,再利用自己的脚本跑

2.百度

MMHUWUV 0e701732711630150438129209816536

MAUXXQC 0e478478466848439040434801845361

IHKFRNS 0e256160682445802696926137988570

GZECLQZ 0e537612333747236407713628225676

GGHMVOE 0e362766013028313274586933780773

GEGHBXL 0e248776895502908863709684713578

EEIZDOI 0e782601363539291779881938479162

DYAXWCA 0e424759758842488633464374063001

这样子就出flag了

2.$a==md5($a)

这一类题型要求满足$a是0e开头,且加密后也是0e开头

在网上收集了这些结果:

0e215962017 0e291242476940776845150308577824

0e1284838308 0e708279691820928818722257405159

0e1137126905 0e291659922323405260514745084877

0e807097110 0e318093639164485566453180786895

0e730083352 0e870635875304277170259950255928

弱比较主要就是以上两种类型。

CTF的MD5强比较

1.md5($a)===md5($b) & $a != $b

方法一:

数组绕过

md5_1[]=1&md5_2[]=2

因为PHP对无法md5加密的东西不加密,结果为NULL,虽然会报错,但是null=null,逻辑关系为True。所以可以输出flag

方法二:

两串不一样的字符,加密结果却相同:

$a=M%C9h%FF%0E%E3%5C%20%95r%D4w%7Br%15%87%D3o%A7%B2%1B%DCV%B7J%3D%C0x%3E%7B%95%18%AF%BF%A2%02%A8%28K%F3n%8EKU%B3_Bu%93%D8Igm%A0%D1%D5%5D%83%60%FB_%07%FE%A2

$b=M%C9h%FF%0E%E3%5C%20%95r%D4w%7Br%15%87%D3o%A7%B2%1B%DCV%B7J%3D%C0x%3E%7B%95%18%AF%BF%A2%00%A8%28K%F3n%8EKU%B3_Bu%93%D8Igm%A0%D1U%5D%83%60%FB_%07%FE%A2

这个我的脚本就跑不出来了,是网上收集的。

题目实战:

1.[BJDCTF2020]Easy MD5

这题也是两个解法:

法一:

param1[]=1¶m2[]=2

法二:

param1=M%C9h%FF%0E%E3%5C%20%95r%D4w%7Br%15%87%D3o%A7%B2%1B%DCV%B7J%3D%C0x%3E%7B%95%18%AF%BF%A2%02%A8%28K%F3n%8EKU%B3_Bu%93%D8Igm%A0%D1%D5%5D%83%60%FB_%07%FE%A2¶m2=M%C9h%FF%0E%E3%5C%20%95r%D4w%7Br%15%87%D3o%A7%B2%1B%DCV%B7J%3D%C0x%3E%7B%95%18%AF%BF%A2%00%A8%28K%F3n%8EKU%B3_Bu%93%D8Igm%A0%D1U%5D%83%60%FB_%07%FE%A2

2.强网杯2020——Funhash

query($query);$row = $result->fetch_assoc(); var_dump($row);$result->free();$mysqli->close();?> 

levle 1

很明显,这种是要md4加密,并且是"0e"+"数字" 加密后还是"0e"+"数字"的形式,上脚本:

import multiprocessingimport hashlibimport randomimport stringimport sysCHARS = string.digitsdef cmp_md4(substr, stop_event, str_len, start=0, size=18):    global CHARS    while not stop_event.is_set():        rnds = ''.join(random.choice(CHARS) for _ in range(size))        rnds = "0e"+rnds        md4 = hashlib.new('md4', rnds.encode("utf-8"))        value = md4.hexdigest()        if value[start: start + str_len] == substr:            print(value)            if value[2:].isdigit():                print(rnds)                stop_event.set()                if __name__ == '__main__':    substr = sys.argv[1].strip()    start_pos = int(sys.argv[2]) if len(sys.argv) > 1 else 0    str_len = len(substr)    cpus = multiprocessing.cpu_count()    stop_event = multiprocessing.Event()    processes = [multiprocessing.Process(target=cmp_md4, args=(substr,       stop_event, str_len, start_pos))                 for i in range(cpus)]    for p in processes:        p.start()    for p in processes:        p.join()                

测试一下,可行

level 2

法一:

hash2[]=1&hash3[]=2

法二:

hash2=M%C9h%FF%0E%E3%5C%20%95r%D4w%7Br%15%87%D3o%A7%B2%1B%DCV%B7J%3D%C0x%3E%7B%95%18%AF%BF%A2%02%A8%28K%F3n%8EKU%B3_Bu%93%D8Igm%A0%D1%D5%5D%83%60%FB_%07%FE%A2&hash3=M%C9h%FF%0E%E3%5C%20%95r%D4w%7Br%15%87%D3o%A7%B2%1B%DCV%B7J%3D%C0x%3E%7B%95%18%AF%BF%A2%00%A8%28K%F3n%8EKU%B3_Bu%93%D8Igm%A0%D1U%5D%83%60%FB_%07%FE%A2

level 3

结果:

只要构造 xx 'or xxxx 的形式就可以了

具体可以看这篇文章

3.构造特定字符串

这个是我觉得以后为了避免大家都用现有的收集字符串解题而出的,比如:

要构造一个开头是123且后面是字母的字符串:

脚本:

import multiprocessingimport hashlibimport randomimport stringimport sysCHARS = string.ascii_letters + string.digitsdef cmp_md5(substr, stop_event, str_len, start=0, size=20):    global CHARS    while not stop_event.is_set():        rnds = ''.join(random.choice(CHARS) for _ in range(size))        md5 = hashlib.md5(rnds)        value = md5.hexdigest()        if value[start: start + str_len] == substr:            print rnds            print value            stop_event.set()        if __name__ == '__main__':                substr = sys.argv[1].strip()                start_pos = int(sys.argv[2]) if len(sys.argv) > 1 else 0                str_len = len(substr)                cpus = multiprocessing.cpu_count()                stop_event = multiprocessing.Event()                processes = [multiprocessing.Process(target=cmp_md5, args=(substr,                   stop_event, str_len, start_pos)) for i in range(cpus)]                for p in processes:                    p.start()                    for p in processes:        p.join()

终端输入Python .\MD5碰撞.py "123" 0

实践试一下:

注意点:跑出来的123后面第一个字符要是字母,如果不是多跑几次,概率还是挺大的。

尾言

还有关于双md5的题目等等,只要掌握了这些思想,看到题目就能想到解法了。这个脚本也是面向百度编程找到的,有一个脚本能跑是比较好的,可以应对各种新情况。使用python脚本是因为有多线程模式,速度更快。

如果代码有不清晰的可以移步 我的博客,因为是直接搬过来的,可能有些地方有点不太好看

来源地址:https://blog.csdn.net/qq_64201116/article/details/126493091

--结束END--

本文标题: MD5碰撞

本文链接: https://www.lsjlt.com/news/400514.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • MD5碰撞
    前言: 在CTF中可以说是经常碰到md5加密了,一般都是进行强比较抑或是弱比较,考法非常多,但是万变不离其中。只要我们掌握了原理,一切问题便迎刃而解了。 文章首发于 我的博客 ,格式可能比较清晰,有兴趣了解CTF中MD5碰撞的伙伴可以移步...
    99+
    2023-09-08
    php 开发语言 web安全
  • ctf中强md5及sha1碰撞绕过(字符串string型)
    记一次ctf实例,以便下次直接引用 ( : 我们直接看代码吧 ...
    99+
    2023-10-05
    网络 php 网络安全 web安全
  • JS快速检索碰撞图形之四叉树碰撞检测
    目录正文四叉树碰撞检测原理四叉树碰撞检测算法一些权衡松散四叉树其他空间分割思想的算法正文 在上篇文章我们讨论了使用 脏矩形渲染,通过重渲染局部的图形来提优化 Canvas 的性能,...
    99+
    2023-01-16
    JS四叉树碰撞检测 JS快速检索碰撞图形
  • Java实现简单碰撞检测
    本文实例为大家分享了Java实现简单碰撞检测的具体代码,供大家参考,具体内容如下 在进行Java游戏开发时,我们经常会遇到碰撞检测的问题。如坦克大战中,炮弹与坦克相遇发生爆炸;守卫者...
    99+
    2024-04-02
  • Java实现圆形碰撞检测
    本文实例为大家分享了Java实现圆形碰撞检测的具体代码,供大家参考,具体内容如下 圆形碰撞图如下: 核心思路是:判断两个圆心之间的距离是否小于两个圆的半径之和。 实现代码如下: ...
    99+
    2024-04-02
  • 一文详解pygame.sprite的精灵碰撞
    目录前言pygame.sprite.Sprite - 可见游戏对象的简单基类。pygame.sprite.Group - 用于保存和管理多个 Sprite 对象的容器类。pygame...
    99+
    2023-01-28
    pygame精灵碰撞代码 pygame.sprite精灵碰撞 pygame精灵碰撞检测
  • Java实现矩形碰撞检测
    本文实例为大家分享了Java实现矩形碰撞检测的具体代码,供大家参考,具体内容如下 第1种方法:通过检测一个矩形的4个顶点是否在另一个矩形的内部来完成。 通常由x和y坐标以及长度和宽度...
    99+
    2024-04-02
  • JavaScript怎么实现碰撞物理引擎
    本文小编为大家详细介绍“JavaScript怎么实现碰撞物理引擎”,内容详细,步骤清晰,细节处理妥当,希望这篇“JavaScript怎么实现碰撞物理引擎”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。效果图:接下来...
    99+
    2023-06-27
  • Python Pygame中精灵和碰撞检测详解
    Pygame精灵和碰撞检测 今天来看看python最出名的游戏库pygame。学习两个名词:精灵和碰撞检测。 精灵英文字母是Sprite。Sprite是二维的图形,在游戏中可以用做各...
    99+
    2024-04-02
  • Pygame 精准检测图像碰撞的问题
    在用Pygame写游戏的时候,有人可能会遇到两个Rect对象碰撞但是对象之间还有空间间隔的问题,这里,将教大家用一种方法精准地检测图像碰撞。 假设我们有两个图像(类型为Surface...
    99+
    2024-04-02
  • Pygame如何使用精灵和碰撞检测
    在开始学习相关知识点之前,我们有必要先学习精灵和碰撞检测的含义。 精灵(英文译为 Sprite),其实在一个游戏程序中,精灵本质指的是一张张小尺寸的图片,比如游戏中的各种道具、人物、...
    99+
    2024-04-02
  • Android之小球自由碰撞动画示例
    目录前言1. add balls List2.ball parameter3. 判断是否有发生碰撞的小球4.application display前言 本文将基于Android对一个...
    99+
    2024-04-02
  • Easyx实现窗口自动碰撞的小球
    本文实例为大家分享了Easyx实现窗口自动碰撞的小球的具体代码,供大家参考,具体内容如下 代码: #include<easyx.h> #include<stdli...
    99+
    2024-04-02
  • Pygame怎么使用精灵和碰撞检测
    本篇内容介绍了“Pygame怎么使用精灵和碰撞检测”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在开始学习相关知识点之前,我们有必要先学习精...
    99+
    2023-06-25
  • PythonOpenCV实战之与机器学习的碰撞
    目录0.前言1.机器学习简介1.1监督学习1.2无监督学习1.3半监督学习2.K均值(K-Means)聚类2.1K-Means聚类示例3.K最近邻3.1K最近邻示例4.支持向量机4....
    99+
    2024-04-02
  • 使用Java编写一个碰撞检测功能
    本篇文章给大家分享的是有关使用Java编写一个碰撞检测功能,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。碰撞检测的过程处理主要有以下三步:碰撞检测(Collision Dete...
    99+
    2023-05-30
    java
  • hash在mysql中解决数据碰撞的方法
    这篇文章将为大家详细讲解有关hash在mysql中解决数据碰撞的方法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。下面我们先讲讲hash的定义以及特点,再用它mysql中解决数据碰撞的问题。Hash数据碰...
    99+
    2023-06-14
  • Html5如何实现Canvas动画基础碰撞检测
    这篇文章主要介绍了Html5如何实现Canvas动画基础碰撞检测,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。 Html5 Canvas动...
    99+
    2024-04-02
  • 利用pygame完成动画精灵和碰撞检测
    动画精灵和碰撞检测 一、动画精灵 动画精灵:四处移动的单个图像或图像部分称为动画精灵(sprite),pygame有一个特殊的模块帮助跟踪屏幕上移动的大量图像。利用这个模块,可以更容...
    99+
    2024-04-02
  • Python与区块链的碰撞:创造新的范式
    Python 与区块链的契合点 Python 的广泛性使其成为区块链开发的理想选择,提供以下优势: 易用性:Python 以其简单的语法和可读性而闻名,降低了区块链开发的门槛。 广泛的库:Python 拥有丰富的库,为区块链开发提供了现...
    99+
    2024-03-13
    Python与区块链
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作