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

MD5和sha1绕过方式总结

<?php
highlight_file(__FILE__);
if ($_GET['name']!=$_GET['password'] &&MD5($_GET['name'])==MD5($_GET['password'])){echo "flag{wo_ce_ni_ma}";
}
?>

用docker起一个Linux服务器的测试环境

1. 0e绕过

PHP在处理哈希字符串时,它把每一个以“0E”开头的哈希值都解释为0,所以如果两个不同的密码经过哈希以后,其哈希值都是以“0E”开头的,PHP会当作科学计数法来处理,也就是0的n次方,得到的值比较的时候都相同。

这种方式只有在弱比较的时候才能使用。

以下值在md5加密后以0E开头:

  • QNKCDZO
  • 240610708
  • s878926199a
  • s155964671a
  • s214587387a
  • s214587387a

以下值在sha1加密后以0E开头:

  • aaroZmOk
  • aaK1STfY
  • aaO8zKZF
  • aa3OFF9m
  • 0e1290633704
  • 10932435112

双重MD5加密后0E开头:

  • 7r4lGXCH2Ksu2JNT3BYM
  • CbDLytmyGm2xQyaLNhWn
  • 770hQgrBOjrcqftrlaZk

2. 数组绕过

对于php强比较和弱比较:md5(),sha1()函数无法处理数组,如果传入的为数组,会返回NULL,所以两个数组经过加密后得到的都是NULL,也就是相等的。

<?php
$a=$_GET['a'];
$b=$_GET['b'];
if ($a!==$b && md5($a)===md5($b)){echo "flag{wo_ce_ni_ma}";
}

3. MD5碰撞

<?php
show_source(__FILE__);
if((string)$_POST['a']!==(string)$_POST['b'] && md5($_POST['a'])===md5($_POST['b'])){echo "flag{wo_ce_ni_ma}";
}

这里比较a,b时将a,b转换为字符串比较,这边就不能用数组了。因为数组转换为字符串时都会变成Array。

因为数组要求构造a和b不同,但是MD5相同,也就是说要求传入两个MD5相同的不同字符串。所以我们只能用MD5碰撞来实现

#1
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%00%A8%28K%F3n%8EKU%B3_Bu%93%D8Igm%A0%D1U%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%02%A8%28K%F3n%8EKU%B3_Bu%93%D8Igm%A0%D1%D5%5D%83%60%FB_%07%FE%A2   
#2
a=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%00%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%55%5d%83%60%fb%5f%07%fe%a2   
b=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%
#3
$a="\x4d\xc9\x68\xff\x0e\xe3\x5c\x20\x95\x72\xd4\x77\x7b\x72\x15\x87\xd3\x6f\xa7\xb2\x1b\xdc\x56\xb7\x4a\x3d\xc0\x78\x3e\x7b\x95\x18\xaf\xbf\xa2\x00\xa8\x28\x4b\xf3\x6e\x8e\x4b\x55\xb3\x5f\x42\x75\x93\xd8\x49\x67\x6d\xa0\xd1\x55\x5d\x83\x60\xfb\x5f\x07\xfe\xa2";
$b="\x4d\xc9\x68\xff\x0e\xe3\x5c\x20\x95\x72\xd4\x77\x7b\x72\x15\x87\xd3\x6f\xa7\xb2\x1b\xdc\x56\xb7\x4a\x3d\xc0\x78\x3e\x7b\x95\x18\xaf\xbf\xa2\x02\xa8\x28\x4b\xf3\x6e\x8e\x4b\x55\xb3\x5f\x42\x75\x93\xd8\x49\x67\x6d\xa0\xd1\xd5\x5d\x83\x60\xfb\x5f\x07\xfe\xa2";

我懒得找了直接偷了一个来

文件:

linux使用md5collgen碰撞生成两个md5值相同但内容不同的文件

md5collgen -o 1.bin 2.bin

windows可以下载fastcoll,碰撞生成两个md5值相同但内容不同的文件

fastcoll.exe -p 123.txt -o 1.txt 2.txt

4. sha1碰撞

a=%25PDF-1.3%0A%25%E2%E3%CF%D3%0A%0A%0A1%200%20obj%0A%3C%3C/Width%202%200%20R/Height%203%200%20R/Type%204%200%20R/Subtype%205%200%20R/Filter%206%200%20R/ColorSpace%207%200%20R/Length%208%200%20R/BitsPerComponent%208%3E%3E%0Astream%0A%FF%D8%FF%FE%00%24SHA-1%20is%20dead%21%21%21%21%21%85/%EC%09%239u%9C9%B1%A1%C6%3CL%97%E1%FF%FE%01%7FF%DC%93%A6%B6%7E%01%3B%02%9A%AA%1D%B2V%0BE%CAg%D6%88%C7%F8K%8CLy%1F%E0%2B%3D%F6%14%F8m%B1i%09%01%C5kE%C1S%0A%FE%DF%B7%608%E9rr/%E7%ADr%8F%0EI%04%E0F%C20W%0F%E9%D4%13%98%AB%E1.%F5%BC%94%2B%E35B%A4%80-%98%B5%D7%0F%2A3.%C3%7F%AC5%14%E7M%DC%0F%2C%C1%A8t%CD%0Cx0Z%21Vda0%97%89%60k%D0%BF%3F%98%CD%A8%04F%29%A1
b=%25PDF-1.3%0A%25%E2%E3%CF%D3%0A%0A%0A1%200%20obj%0A%3C%3C/Width%202%200%20R/Height%203%200%20R/Type%204%200%20R/Subtype%205%200%20R/Filter%206%200%20R/ColorSpace%207%200%20R/Length%208%200%20R/BitsPerComponent%208%3E%3E%0Astream%0A%FF%D8%FF%FE%00%24SHA-1%20is%20dead%21%21%21%21%21%85/%EC%09%239u%9C9%B1%A1%C6%3CL%97%E1%FF%FE%01sF%DC%91f%B6%7E%11%8F%02%9A%B6%21%B2V%0F%F9%CAg%CC%A8%C7%F8%5B%A8Ly%03%0C%2B%3D%E2%18%F8m%B3%A9%09%01%D5%DFE%C1O%26%FE%DF%B3%DC8%E9j%C2/%E7%BDr%8F%0EE%BC%E0F%D2%3CW%0F%EB%14%13%98%BBU.%F5%A0%A8%2B%E31%FE%A4%807%B8%B5%D7%1F%0E3.%DF%93%AC5%00%EBM%DC%0D%EC%C1%A8dy%0Cx%2Cv%21V%60%DD0%97%91%D0k%D0%AF%3F%98%CD%A4%BCF%29%B1

5. $a=md5($a)

0e215962017 的 MD5 值也是由 0e 开头,在 PHP 弱类型比较中相等

6. NAN和INF

NAN和INF,分别为非数字和无穷大,但是var_dump一下它们的数据类型却是double,那么在md5函数处理它们的时候,是将其直接转换为字符串”NAN”和字符串”INF”使用的,但是它们拥有特殊的性质,它们与任何数据类型(除了true)做强类型或弱类型比较均为false,甚至NAN=NAN都是false,但md5('NaN')=md5('NaN')为true。

7. 截断比较

substr(md5(?),0,5)==='8ffb1'
7.1. MD5截断爆破

给出一段md5值要求找到匹配的原码。一般使用爆破脚本:

import hashlib
from multiprocessing.dummy import Pool as ThreadPool# MD5截断数值已知 求原始数据
# 例子 substr(md5(captcha), 0, 6)=60b7efdef md5(s):  # 计算MD5字符串return hashlib.md5(str(s).encode('utf-8')).hexdigest()keymd5 = '8ffb1'   #已知的md5截断值
md5start = 0   # 设置题目已知的截断位置
md5length = 5def findmd5(sss):    # 输入范围 里面会进行md5测试key = sss.split(':')start = int(key[0])   # 开始位置end = int(key[1])    # 结束位置result = 0for i in range(start, end):# print(md5(i)[md5start:md5length])if md5(i)[0:5] == keymd5:            # 拿到加密字符串result = iprint(result)    # 打印breaklist=[]  # 参数列表
for i in range(10):   # 多线程的数字列表 开始与结尾list.append(str(10000000*i) + ':' + str(10000000*(i+1)))
pool = ThreadPool()    # 多线程任务
pool.map(findmd5, list) # 函数 与参数列表
pool.close()
pool.join()
7.2. sha256截断爆破

脚本:

import hashlib
from multiprocessing.dummy import Pool as ThreadPool# sha256截断数值已知 求原始数据
# 例子 substr(sha256(captcha), 0, 6)=60b7efdef sha256(s):  # 计算sha256字符串return hashlib.sha256(('TQLCTF'+str(s)).encode('utf-8')).hexdigest()keysha256 = '5625f'   #已知的sha256截断值
sha256start = 0   # 设置题目已知的截断位置
sha256length = 5def findsha256(sss):    # 输入范围 里面会进行sha256测试key = sss.split(':')start = int(key[0])   # 开始位置end = int(key[1])    # 结束位置result = 0for i in range(start, end):# print(sha256(i)[sha256start:sha256length])if sha256(i)[0:5] == keysha256:            # 拿到加密字符串result = iprint(result)    # 打印breaklist=[]  # 参数列表
for i in range(10):   # 多线程的数字列表 开始与结尾list.append(str(10000000*i) + ':' + str(10000000*(i+1)))
pool = ThreadPool()    # 多线程任务
pool.map(findsha256, list) # 函数 与参数列表
pool.close()
pool.join()

http://www.xdnf.cn/news/1005.html

相关文章:

  • 第六章.java集合与泛型
  • 街景主观感知全流程(自建数据集+两两对比程序+Trueskill计算评分代码+训练模型+大规模预测)17
  • 冒泡排序详解
  • 使用若依二次开发商城系统-1
  • vue项目通过GetCapabilities获取wmts服务元数据信息并在openlayers进行叠加显示
  • 配置管理CM
  • 衡石chatbi如何通过 iframe 集成
  • 制作一款打飞机游戏14:资源优化
  • Nginx下搭建rtmp流媒体服务 并使用HLS或者OBS测试
  • 性能比拼: Nginx vs Caddy
  • NHANES指标推荐:PhenoAge
  • Ldap高效数据同步- Delta-Syncrepl复制模式配置实战手册(上)
  • 极验4滑块笔记:整理思路--填坑各种问题
  • 傲来云分享,负载均衡:提升网站性能与稳定性
  • 无人机飞控运行在stm32上的RTOS实时操作系统上,而不是linux这种非实时操作系统的必要性
  • 【前端】【面试】【业务场景】前端如何获取并生成设备唯一标识
  • 报错 | 配置 postcss 出现 报错:A `require()` style import is forbidden.
  • C++中的算术转换、其他隐式类型转换和显示转换详解
  • 开发指南:构建结合数字孪生、大语言模型与知识图谱的智能设备日志分析及生产异常预警系统
  • ByteTrack自定义数据集训练指南
  • 如何将SpringBoot前后端项目制作成windows运行的exe文件
  • 【python实用小脚本系列】用Python让鼠标“动起来”:光标自动移动、自动点击、自动图象识别的小技巧
  • 【教程】Digispark实现串口通信
  • 计算机是如何工作的
  • 使用Python可视化偶极子的电场
  • 2025年一站式AI创作平台主要功能介绍及使用教程
  • rac防火墙未禁用服务器重启导致二节点启动异常
  • Unity 场景管理核心教程:从 LoadScene 到 Loading Screen 实战 (Day 35)
  • 简单了解一下Unity Shader中的Swizzle操作
  • AI Agent认知框架(ReAct、函数调用、计划与执行、自问自答、批判修正、思维链、思维树详解和对比,最后表格整理总结