1. 程式人生 > 其它 >MD5繞過相關

MD5繞過相關

MD5繞過

1.if($a != $b && md5($a) == md5($b))

  • 陣列繞過法:如:?a[]=1&b[]=2
  • 直接傳入引數a=s1885207154a,b=s1836677006a,即可,為什麼呢?看一下這兩個字串的md5值可以返現分別如下:
MD5值: 
 md5("s1885207154a") => 0e509367213418206700842008763514
 md5("s1836677006a") => 0e481036490867661113260034900752

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

2.if($_POST['param1']!==$_POST['param2']&&md5($_POST['param1'])===md5($_POST['param2']))

由於php的md5函式處理陣列時直接返回null,將param1,param2設為陣列即可,如:?param1[]=1&param2[]=2

3.雙MD5碰撞繞過if ($a != $b && md5($a) == md5(md5($b))

由 1 知雙面的判斷出現了md5(md5($b),有了前面的鋪墊,這裡我們第一感覺就是找到一個字串其MD5值的MD5仍然是0e開頭的那就好了。

雙md5結果仍為0e開頭字串:

CbDLytmyGm2xQyaLNhWn
 
md5(CbDLytmyGm2xQyaLNhWn) => 0ec20b7c66cafbcc7d8e8481f0653d18
 
md5(md5(CbDLytmyGm2xQyaLNhWn)) => 0e3a5f2a80db371d4610b8f940d296af
 
770hQgrBOjrcqftrlaZk
 
md5(770hQgrBOjrcqftrlaZk) => 0e689b4f703bdc753be7e27b45cb3625
 
md5(md5(770hQgrBOjrcqftrlaZk)) => 0e2756da68ef740fd8f5a5c26cc45064
 
7r4lGXCH2Ksu2JNT3BYM
 
md5(7r4lGXCH2Ksu2JNT3BYM) => 0e269ab12da27d79a6626d91f34ae849 md5(md5(7r4lGXCH2Ksu2JNT3BYM)) => 0e48d320b2a97ab295f5c4694759889f

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.argv[1].strip()
    start_pos = int(sys.argv[2]) if len(sys.argv) > 1 else 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開頭的字串。

轉載於:

不忘初心,方得始終。