PHP中MD5和sha1绕过方式总结

### 1.0e绕过弱比较(MD5函数漏洞)

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

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

还有的时候会限制字符串为纯数字或字母,这些特殊条件的字符串可以自行搜索。

image-20220327104619368

1|02.数组绕过

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

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

GET情况下的payload(POST同理):

?a[]=1&b[]=2

image-20220327103431855

2|03.MD5碰撞

2|1MD5

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

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

image-20220327110714685

因为数组要求构造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";

注意一点,post时一定要urlencode!!!

文件:

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

md5collgen -o 1.bin 2.bin

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

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

2|2sha1碰撞:

1|0url:
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

两个SHA1值相同而不一样(SHA256的值不同)的pdf文件, shattered-1.pdfshattered-2.pdf

3|04.$a==md5($a)

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

4|05.NaN 和 INF

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

5|06.截断比较

substr(md5(?),0,5)==='8ffb1'

5|1MD5截断爆破

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

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

5|2sha256截断爆破

脚本:

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

__EOF__

本文作者dre0m1
本文链接https://www.cnblogs.com/dre0m1/p/16062369.html
关于博主:I am a good person
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   dre0m1  阅读(5547)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
点击右上角即可分享
微信分享提示