相关资料

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

1. MD5函数漏洞

<?php
$_GET['name'] != $_GET['password']
MD5($_GET['name']) == MD5($_GET['password'])
?>

要求满足上述条件则

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

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

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

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

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

  • sha1(‘aaroZmOk’)
  • sha1(‘aaK1STfY’)
  • sha1(‘aaO8zKZF’)
  • sha1(‘aa3OFF9m’)

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

2. PHP特性

<?php
$_GET['a'] !== $_GET['b'] && md5($_GET['a']) === md5($_GET['b'])
?>

在php中===为完全等于运算,不仅比较值,而且还比较值的类型,只有两者一致才为真。再次使用a=QNKCDZO&b=240610708就不行了,因为a和b类型不同。

PHP中md5的函数特性

<?php
md5([1,2,3]) == md5([4,5,6]) == NULL
?>

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

3. MD5碰撞

<?php
if($_POST['param1']!==$_POST['param2'] && md5($_POST['param1'])===md5($_POST['param2'])){
    die("success!");
}
?>

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

Param1 = %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相同,注意一点,post时一定要urlencode!!!

记录一些常见的MD5值

1. 纯数字类

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

2. 大写字母类

QLTHNDT

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

3. py脚本

import hashlib
for i in range(1, 100000001):
    #s = hashlib.md5(str(i).encode("utf-8")).hexdigest()[0:8]
    #s = hashlib.md5(str(i).encode("utf-8")).hexdigest()[:6]
    #s = hashlib.md5(str(i).encode("utf-8")).hexdigest()[0:6]
    if s == "0ee969":
        print(i)
        break


本网站博主