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