当前位置: 首页 > news >正文

md5强弱碰撞

一,类型。

1.弱比较

php中的"=="和"===="在进行比较时,数字和字符串比较或者涉及到数字内容的字符串,则字符串会被转换为数值并且比较按照数值来进行。按照此理,我们可以上传md5编码后是0e的字符串,在比较时php语言会将0e开头的数据认为是科学记数法,而后面的数据会被当做0。

例如:a=xxx&b=xxxx

240610708:0e462097431906509019562988736854
QLTHNDT:0e405967825401955372549139051580
QNKCDZO:0e830400451993494058024219903391
PJNPDWY:0e291529052894702774557631701704
NWWKITQ:0e763082070976038347657360817689
NOOPCJF:0e818888003657176127862245791911
MMHUWUV:0e701732711630150438129209816536
MAUXXQC:0e478478466848439040434801845361

2.强比较

php中的''==='在比较时先判断字符串类型是否相同,再比较值。

数组绕过:md5不能加密数组,在加密数组的时候会返回NULL,如果设置没有判断变量类型或内容,就可以使用,因此,强弱比较都是可以使用数组绕过的。

eg:a[]=1&b[]=2

3.真实碰撞对(md5值)

eg:

0e306561559aa787d00bc6f70bbdfe3404cf03659e704f8534c00ffb659c4c8740cc942feb2da115a3f4155cbb8607497386656d7d1f34a42059d78f5a8dd1ef

和0e306561559aa787d00bc6f70bbdfe3404cf03659e744f8534c00ffb659c4c8740cc942feb2da115a3f415dcbb8607497386656d7d1f34a42059d78f5a8dd1ef

二,示例

[SWPUCTF 2021 新生赛]easy_md5(弱)

1.包含有一个flag.php的文件,然后 get传参name,post传参password,当name和password的值不等,但是他们的md5值相等时,就会输出flag,否则输出wrong

2.数组绕过

3. 0e绕过

[BJDCTF 2020]easy_md5(sql+弱+强)

1.打开环境,提交查询后,在地址栏出现password=输入内容。

2.bp抓包重放后发现hint: select * from 'admin' where password=md5($pass,true)

3.绕过:ffifdyop

4.得到一个新的页面,看源码,get传参a和b的弱比较,数组绕过或0e绕过

数组绕过     ?a[]=1&b[]=2                  0e绕过      ?a=xxxx&b=xxxx

5.得到一个新页面,强比较post传参param1和param2。

post传参 数组绕过:param1[]=a&param2[]=b,得到flag

 [SWPUCTF 2022 新生赛]奇妙的MD5(sql+弱+强)

1.开始的绕过——ffifdyop

2.弱比较

3. 强比较:post传参wqh和dsy

 [NSSCTF 2022 Spring Recruit]babyphp(正则+强+0e弱)

1,打开环境,是一串代码,包含有一个flag.php文件

正则

:preg_match是php函数,会被搜索的结果所填充,进行正则表达式匹配。并且只匹配一次

此处为检查表单提交的数据是否满足以下条件:

  1. 变量 $_POST['a'] 是否存在;
  2. 变量 $_POST['a'] 中不包含数字;
  3. 变量 $_POST['a'] 可以转换为整数。

post传参a,正则绕过

可以使用数组绕过为a[]=1

2.要求b1和b2强碰撞

b1[]=3&b2[]=4

3.c1和c2弱碰撞,强调了要传入c1不等于c2且c1,c2都要是字符串,c1,c2的MD5值要相等 所以c就不能用数组绕过,可以用科学计数法0e绕过

c1=s878926199a&c2=s155964671a

4.同时满足以上条件

a[]=1&b1[]=3&b2[]=4&c1=s878926199a&c2=s155964671a

 

 [GDOUCTF 2023]受不了一点(php数字与字符比较)

1.php代码如下

1.post传参ctf和gdou会将ctf赋值给b以及gdou赋值给a并进行md5的强比较

ctf[]=1&gdou[]=2

2.get传参aaa和bbb要求其数值等于114514但是这两个的真实值不同(数字弱比较)

当字符串与数字进行比较时,字符串会转换成整型/浮点型进行比较$a='114514a'--->114514

aaa=114514&bbb=114514a

3.设置cookie=j0k3r

4.post传参flag与get传参flag,检查 $_POST['flag'] 是否等于字符串 'flag',或者 $_GET['flag'] 是否等于字符串 'flag'。如果任一条件为真,则它使用 die() 函数来终止脚本的执行

此处要不结束进程,flag的值要不相等或者我们可以直接不传flag

绕过:flag=33&33=flag或者分别传参不相等,这里我试验了没成功,但是按道理就是这样的,如果有能解答的请解答一下。

[UUCTF 2022 新生赛]funmd5(暂缓)

1.打开环境是一段代码

  • preg_replace 用于尝试替换掉可能的 "0e" 形式的字符串,但替换后的字符串并未被重新赋值给 $md5
  • preg_match 用于检查 $md5[0] 是否包含 "0e".
  • $sub 的赋值在 if(isset($md5)) 块之外是无效的.

三,md5碰撞实验

此类说明和解释了怎样生成和为什么可以做到不同行为的两个可执行文件具有相同的MD5值,直接参考吧。

网络攻防技术——MD5碰撞实验-CSDN博客

四,ffifdyop——详解

select * from `admin` where password=md5($pass,true)

md5在此处是一个函数,语法为md5(string,raw)

string:必需,规定要使用的字符串。raw:可选    默认不写为FALSE。32位16进制的字符串TRUE。16位原始二进制格式的字符串

当raw项为true时,返回的这个原始二进制不是普通的二进制(0,1),而是  'or'6\xc9]\x99\xe9!r,\xf9\xedb\x1c

32位16进制字符串:将MD5加密得到的128 位长度的值以每4位为一组,分为32组,每组以转换为16进制,进行转换得到一个32位的字符串。也就是md5加密。即md5的raw为true时,该函数的输出是原始二进制格式,会被作为字符串处理

构造一个语句使sql语句永恒为真 

布尔型判断时,以数字开头的字符串会被当做整型数,要单引号括起来(闭合语句),eg:password=‘xxx’ or ‘1xxxxxxxxx’,那么就相当于password=‘xxx’ or 1  ,也就是password=‘xxx’ or true,当xxx为纯数字时就可以不用引号

目标:要找一个字符串取32位16进制的md5值里带有276f7227这个字段的,加上数字部分

最终:想要得到一个可以绕过md5的值,就要有以下要素

1.   'or'    该符号对应的16进制是   276f7227 

2.   在276f7227这个字段后面紧跟一个数字,除了0,就是1-9,对应的asc码值是49-57,转化为16进制就是31-39,最终形式为276f7227+(31-39)

3.最终xxxxxx276f7227+(31-39)这样形式的md5值,但是因为md5的特性,要把这个从md5解密出来需要庞大的计算,因此一般不会去另找。

相关文章:

  • Java 五种内部类演示及底层原理详解
  • zibll-V7.7最新版2024完美破解授权可用(含授权教程)
  • Typescript高级: 深入理解Partial类型和Required类型
  • linux tomcat版本漏洞升级
  • B站如何屏蔽短视频:成都鼎茂宏升文化传媒公司
  • 从零开始实现自己的串口调试助手(3) - 显示底部收发,优化串口打开/关闭
  • Gitlub如何删除分支(删除远程分支+本地分支)
  • 彻底卸载Windows Defender
  • 童心与美食的邂逅,蒙自源邀你共绘梦想画卷
  • 使用YOLOv10训练自己的数据集
  • Java基础八股
  • opencv笔记(13)—— 停车场车位识别
  • 银行批量支付业务功能测试点详细介绍
  • C语言编程零基础:开启编程之旅的起点
  • 乡镇围栏数据存储ES实践
  • Git学习与使用心得(1)—— 初始化
  • iOS 系统授权开发
  • JavaScript类型识别
  • Java到底能干嘛?
  • jQuery(一)
  • js写一个简单的选项卡
  • Koa2 之文件上传下载
  • Redis的resp协议
  • vue2.0开发聊天程序(四) 完整体验一次Vue开发(下)
  • Vue组件定义
  • windows下使用nginx调试简介
  • 基于HAProxy的高性能缓存服务器nuster
  • 聊聊springcloud的EurekaClientAutoConfiguration
  • 排序算法学习笔记
  • 如何胜任知名企业的商业数据分析师?
  • 新版博客前端前瞻
  • ​ 无限可能性的探索:Amazon Lightsail轻量应用服务器引领数字化时代创新发展
  • ​configparser --- 配置文件解析器​
  • # dbt source dbt source freshness命令详解
  • #Z2294. 打印树的直径
  • (13)[Xamarin.Android] 不同分辨率下的图片使用概论
  • (cos^2 X)的定积分,求积分 ∫sin^2(x) dx
  • (PySpark)RDD实验实战——求商品销量排行
  • (附表设计)不是我吹!超级全面的权限系统设计方案面世了
  • (每日持续更新)jdk api之StringBufferInputStream基础、应用、实战
  • (切换多语言)vantUI+vue-i18n进行国际化配置及新增没有的语言包
  • (实测可用)(3)Git的使用——RT Thread Stdio添加的软件包,github与gitee冲突造成无法上传文件到gitee
  • (四)汇编语言——简单程序
  • (转)iOS字体
  • .NET Core WebAPI中使用swagger版本控制,添加注释
  • .net framwork4.6操作MySQL报错Character set ‘utf8mb3‘ is not supported 解决方法
  • .net6 webapi log4net完整配置使用流程
  • .NET6 开发一个检查某些状态持续多长时间的类
  • .NET开发不可不知、不可不用的辅助类(三)(报表导出---终结版)
  • .NET开发不可不知、不可不用的辅助类(一)
  • .NET命令行(CLI)常用命令
  • .net实现头像缩放截取功能 -----转载自accp教程网
  • .net之微信企业号开发(一) 所使用的环境与工具以及准备工作
  • @manytomany 保存后数据被删除_[Windows] 数据恢复软件RStudio v8.14.179675 便携特别版...
  • @ModelAttribute 注解