md5相等及碰撞繞過

2021-09-29 08:23:07 字數 3446 閱讀 4229

在ctf中經常會遇到要求v1!=v2,但md5(v1)==md5(v2)的情況,所以上網蒐集了一下資料,學習了一下大佬的思路,拓展思路。

在php中,變數都是弱型別的(就是不指定特定資料型別的),使用if判等的時候要格外小心,使用特殊的引數可能會使本來不相等的if判斷位相等,比如下面的例子。

<?phpif(

isset

($_get

['a'])

&&isset

($_get

['b'])

)";}

else

}else

?>

上面只要傳入引數a=s1885207154a,b=s1836677006a,即可,為什麼呢?看一下這兩個字串的md5值可以返現分別如下:

md5值

md5("s1885207154a") => 0e509367213418206700842008763514

md5("s1836677006a") => 0e481036490867661113260034900752

二者都是0e開頭,在php中0e會被當做科學計數法,就算後面有字母,其結果也是0,所以上面的if判斷結果使true,成功繞過

拓展 雙md5碰撞繞過

<?phpif(

isset

($_get

['a'])

&&isset

($_get

['b'])

)";}

else

}else

?>

雙面的判斷出現了md5(md5($b),有了前面的鋪墊,這裡我們第一感覺就是找到乙個字串其md5值的md5仍然是0e開頭的那就好了。開始的時候我不敢相信,那幾率得多小啊,但是在昨天做一道md5截斷碰撞的時候我就來了靈感,何不嘗試一下,結果發現原來這種字串使真的存在,並且碰撞0e開頭的時候不到一秒鐘就能碰撞到。

md5值

md5("v5vdshva7fjyjoj33iql") => 0e18bb6e1d5c2e19b63898aeed6b37ea

md5("0e18bb6e1************") => 0e0a710a092113dd5ec9dd47d4d7b86f

拓展2 雙md5結果仍是0e開頭字串大全

md5大全

cbdlytmygm2xqyalnhwn

md5(cbdlytmygm2xqyalnhwn) => 0ec20b7c66cafbcc7d8e8481f0653d18

md5(md5(cbdlytmygm2xqyalnhwn)) => 0e3a5f2a80db371d4610b8f940d296af

770hqgrbojrcqftrlazk

md5(770hqgrbojrcqftrlazk) => 0e689b4f703bdc753be7e27b45cb3625

md5(md5(770hqgrbojrcqftrlazk)) => 0e2756da68ef740fd8f5a5c26cc45064

7r4lgxch2ksu2jnt3bym

md5(7r4lgxch2ksu2jnt3bym) => 0e269ab12da27d79a6626d91f34ae849

md5(md5(7r4lgxch2ksu2jnt3bym)) => 0e48d320b2a97ab295f5c4694759889f

拓展3 md5碰撞指令碼

# -*- coding: utf-8 -*-

import multiprocessing

import hashlib

import random

import string

import sys

chars

= string.letters + string.digits

def cmp_md5

(substr, stop_event, str_len,

. start=

0, size=20)

:global

chars

while not stop_event.

is_set()

: rnds =''.

join

(random.

choice

(chars

)for _ in range

(size)

) md5 = hashlib.

md5(rnds)

value = md5.

hexdigest()

if value[start: start+str_len]

== substr:

print rnds

stop_event.

set()''

' #碰撞雙md5

md5 = hashlib.md5(value)

if md5.hexdigest()[start: start+str_len] == substr:

print rnds+ "=>" + value+"=>"+ md5.hexdigest() + "\n"

stop_event.set()

'''if __name__ ==

'__main__'

: substr = sys.ar**[1]

.strip()

start_pos =

int(sys.ar**[2]

)iflen(sys.ar**)

>

1else

0 str_len =

len(substr)

cpus = multiprocessing.

cpu_count()

stop_event = multiprocessing.

event()

processes =

[multiprocessing.

process

(target=cmp_md5, args=

(substr,

stop_event, str_len, start_pos)

)for i in range

(cpus)

]for p in processes:

p.start()

for p in processes:

p.join

()

上面指令碼注釋部分是雙md5碰撞,取消注釋然後注釋掉16行即可。

使用方法:python md5crack.py 「你要碰撞的字串」 字串的起始位置

例如:python md5crack.py 「0e" 0

將產生md5值為0e開頭的字串。

ctfshow SQL注入 md5繞過

沒錯,又是我,那個大醜逼,哦不對,我在說什麼,是大帥逼 md5繞過 username post username password md5 post password true 只有admin可以獲得flagif username admin 看一下md5函式 菜鳥 啟動!true 原始 16 字元...

md5繞過 Hash比較缺陷

if md5 username md5 password 題目大意是要輸入乙個字串和數字型別,並且他們的md5值相等,就可以成功執行下一步語句 介紹一批md5開頭是0e的字串 上文提到過,0e在比較的時候會將其視作為科學計數法,所以無論0e後面是什麼,0的多少次方還是0。寫乙個指令碼自己驗證 imp...

MD5的小碰撞例項

我的名字 陳聰 md5 陳聰,32 fe3f593fb5e56dd070187290697a8f6e md5 陳聰,16 b5e56dd070187290 乙個字元 hj md5 hj,32 fe3f593fb5e56dd070187290697a8f6e md5 hj,16 b5e56dd0701...