MD5截断比较验证

最近在打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'

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都是可以使用的,针对不同情况可以选择爆破出不同数量的结果

posted @ 2019-08-04 11:08  Ye'sBlog  阅读(2281)  评论(4编辑  收藏  举报