最近在打De1CTF時在Web項目中碰到了兩次MD5截斷比較驗證的題目,在做題時為了方便順手寫了一個小腳本來爆破Code,下面就簡單分享一下思路
以De1CTF線上賽Web3為例,在De1CTF中,我遇到的MD5截斷比較驗證是這樣的:
這個驗證碼提示的意思是“將問號(即為Code)進行md5加密之后截取前5位===9331c”
那么在理論上存在的可能性有16^5種,頁面每次刷新之后md5都會更新一次,但是在現實中,md5前五位相同是多解
那么我們的思路就可以梳理為:創建一個彩虹表進行比對,暴力猜解Code
from multiprocessing.dummy import Pool as tp import hashlib knownMd5 = '9331c' #已知的md5明文
def md5(text): return hashlib.md5(str(text).encode('utf-8')).hexdigest() def findCode(code): key = code.split(':') start = int(key[0]) end = int(key[1]) for code in range(start, end): if md5(code)[0:5] == knownMd5: print code break list=[] for i in range(3): #這里的range(number)指爆破出多少結果停止 list.append(str(10000000*i) + ':' + str(10000000*(i+1))) pool = tp() #使用多線程加快爆破速度 pool.map(findCode, list) pool.close() pool.join()
運行結果如下:
以上輸出的3個Code都是可以使用的,針對不同情況可以選擇爆破出不同數量的結果