最近在打De1CTF时在Web项目中碰到了两次MD5截断比较验证的题目,在做题时为了方便顺手写了一个小脚本来爆破Code,下面就简单分享一下思路
以De1CTF线上赛Web3为例,在De1CTF中,我遇到的MD5截断比较验证是这样的:
这个验证码提示的意思是“将问号(即为Code)进行md5加密之后截取前5位===9331c”
那么在理论上存在的可能性有16^5种,页面每次刷新之后md5都会更新一次,但是在现实中,md5前五位相同是多解
那么我们的思路就可以梳理为:创建一个彩虹表进行比对,暴力猜解Code
1 from multiprocessing.dummy import Pool as tp 2 import hashlib 3 4 knownMd5 = '9331c' #已知的md5明文 5 6 def md5(text): 7 return hashlib.md5(str(text).encode('utf-8')).hexdigest() 8 9 def findCode(code): 10 key = code.split(':') 11 start = int(key[0]) 12 end = int(key[1]) 13 for code in range(start, end): 14 if md5(code)[0:5] == knownMd5: 15 print code 16 break 17 18 list=[] 19 for i in range(3): #这里的range(number)指爆破出多少结果停止 20 list.append(str(10000000*i) + ':' + str(10000000*(i+1))) 21 pool = tp() #使用多线程加快爆破速度 22 pool.map(findCode, list) 23 pool.close() 24 pool.join()
运行结果如下:
以上输出的3个Code都是可以使用的,针对不同情况可以选择爆破出不同数量的结果