浙江ctf2024 预赛前_复习——MD5比较、哈希比较

<aside> 💡

原理介绍

</aside>

**强比较:使用三个 ''==='' 比较,比较值,也比较类型

弱比较:使用两个 ''=='' 比较,只比较值,不比较类型

a==b   将a,b的值转换成同类型再比较值
a===b 先判断a,b类型,若相同,则比较值,若不相同,则返回false**

<aside> 💡

解题思路

</aside>

**数组绕过,0e绕过

QNKCDZO 240610708 常用

md5($a)==md5(md5($a))

0e215962017

MD5加密登录万能通用

ffifdyop**

<aside> 💡

md5弱比较

</aside>

**1.字符型和字符型比较,为同类型,比较其内容,例''abc''==''c'' => false

2.数字型和数字型比较,同上,例:123 == 12 => false

123 ==123=> true

3.字符型和数字型比较,若字符型值开头为数字,转为数字;

若开头不为数字,为 null 弱比较与 0 相等。

例:''abc123''==123 => false

      "123abc"==123 => true

      ''abc123''==0 => true

      ''123''==123 => true

     ''123abc''==12 => false**

<aside> 💡

弱比较0e绕过

</aside>

原理

**2 760 000 = 2.76×10^6 = 2.76e6**

一些payload

**加密后的密文                      原值

QNKCDZO           0E830400451993494058024219903391
240610708           0E462097431906509019562988736854
s878926199a       0E545993274517709034328855841020
s155964671a       0E342768416822451524974117254469
s214587387a       0E848240448830537924465865611904

0e开头的md5和原值:
QNKCDZO
0e830400451993494058024219903391
240610708
0e462097431906509019562988736854
s878926199a
0e545993274517709034328855841020
s155964671a
0e342768416822451524974117254469
s214587387a
0e848240448830537924465865611904
s214587387a
0e848240448830537924465865611904
s878926199a
0e545993274517709034328855841020
s1091221200a
0e940624217856561557816327384675
s1885207154a
0e509367213418206700842008763514
s1502113478a
0e861580163291561247404381396064
s1885207154a
0e509367213418206700842008763514
s1836677006a
0e481036490867661113260034900752
s155964671a
0e342768416822451524974117254469
s1184209335a
0e072485820392773389523109082030
s1665632922a
0e731198061491163073197128363787
s1502113478a
0e861580163291561247404381396064
s1836677006a
0e481036490867661113260034900752
s1091221200a
0e940624217856561557816327384675
s155964671a
0e342768416822451524974117254469
s1502113478a
0e861580163291561247404381396064
s155964671a
0e342768416822451524974117254469
s1665632922a
0e731198061491163073197128363787
s155964671a
0e342768416822451524974117254469
s1091221200a
0e940624217856561557816327384675
s1836677006a
0e481036490867661113260034900752
s1885207154a
0e509367213418206700842008763514
s532378020a
0e220463095855511507588041205815
s878926199a
0e545993274517709034328855841020
s1091221200a
0e940624217856561557816327384675
s214587387a
0e848240448830537924465865611904
s1502113478a
0e861580163291561247404381396064
s1091221200a
0e940624217856561557816327384675
s1665632922a
0e731198061491163073197128363787
s1885207154a
0e509367213418206700842008763514
s1836677006a
0e481036490867661113260034900752
s1665632922a
0e731198061491163073197128363787
s878926199a
0e545993274517709034328855841020**

例子

**$a=$_GET['a'];
$b=$_GET['b'];
md5($a)==md5($b)

payload:?a=QNKCDZO&b=240610708**

<aside> 💡

$a==md5($a); 一次md5的加密

</aside>

**payload:?a=0e215962017

因为md5("0e215962017")=0e291242476940776845150308577824**

<aside> 💡

两次md5的加密

</aside>

**payload:?md5(md5(0E830400451993494058024219903391))=0E545993274517709034328855841020**

<aside> 💡

弱比较数组绕过

</aside>

原理

**md5不能加密数组 ,如 a[]=1 , b[]=1 , 传入数组会报错,但会继续执行并且返回结果为null

比如传入md5(a[]=1)==md5(b[]=2),实际上是null==null,所以数组进行md5弱比较时,结果相等**

例子

**$a=$_GET['a'];
$b=$_GET['b'];
md5($a)==md5($b)

payload:?a[]=1&b[]=2**

<aside> 💡

强比较

</aside>

原理

**强比较:使用三个 ''==='' 比较,比较值,也比较类型。**

<aside> 💡

强比较数组绕过

</aside>

**payload:?a[]=1&b[]=2**

<aside> 💡

md5值完全相同的字符绕过(md5碰撞)

</aside>

例题

**$a=$_GET['a'];
$b=$_GET['b'];
md5($a)===md5($b)**

payload

payload:?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%a2%02%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%d5%5d%83%60%fb%5f%07%fe%a2

<aside> 💡

md5值完全相同的字符串

</aside>

**array1=%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

array2=%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%02%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%d5%5d%83%60%fb%5f%07%fe%a2**

<aside> 💡

md5值固定段爆破脚本

</aside>

**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 = '8031b' # 已知的 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()**

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值