验证码的识别与爆破 – 作者:菜头想学安全

简言

后台登录界面有验证码存在时,能阻拦住大部分想进行暴力破解的人.本文将利用Python进行简单的验证码识别,本来还想学习一下tesseract的机器学习提高识别率来着,但是我太菜了,一直报错.

安装tesseract

OCR,即Optical Character Recognition,光学字符识别,是指通过扫描字符,然后通过其形状将其翻译成电子文本的过程.对于图形验证码来说,它们都是一些不规则的字符,这些字符确实是由字符稍加扭曲变换得到的内容.

tesseract下载地址:https://digi.bib.uni-mannheim.de/tesseract/

图片[1]-验证码的识别与爆破 – 作者:菜头想学安全-安全小百科

这里我选择的是tesseract-ocr-w64-setup-v5.0.0-alpha.20210506

为了能在python中使用我们还需要安装pytesseract

pip install pytesseract

找到python的安装路径下的pytesseract,使用记事本编辑pytesseract.py,将tesseract_cmd = ‘tesseract’改为tesseract.exe所在的绝对路径.

图片[2]-验证码的识别与爆破 – 作者:菜头想学安全-安全小百科

简单测试

随便找了一个网站后台

图片[3]-验证码的识别与爆破 – 作者:菜头想学安全-安全小百科

像这种无线条干扰的验证码图片是最容易识别的,将图片下载到本地.

import pytesseract
from PIL import Image

text = pytesseract.image_to_string(Image.open("./captcha.png"))
print(text)

输出结果:

图片[4]-验证码的识别与爆破 – 作者:菜头想学安全-安全小百科

输入结果中存在特殊字符,可以使用re正则匹配去除,代码更改如下

import pytesseract
from PIL import Image
import re

text = pytesseract.image_to_string(Image.open("./captcha.png"))
text = re.findall('\w.*',text)[0]
print(text)

输出结果:

图片[5]-验证码的识别与爆破 – 作者:菜头想学安全-安全小百科

去噪处理

图片[6]-验证码的识别与爆破 – 作者:菜头想学安全-安全小百科

像这种图片需要进行去噪处理,去除线条的干扰

利用Image对象的convert()方法传入参数(‘L’),即可将图像转为灰度图像,然后进行二值化处理,去噪的关键在于二值化的阈值取值多少,二值化的阈值如何确定我也没有太好的方法,只能通过image.show()展示的图片的清晰程度不断调整.

import pytesseract
from PIL import Image

image = Image.open('./checkCode.jpg')
image =image.convert('L')
threshold = 60
table = []
for i in range(256):
    if i < threshold:
        table.append(0)
    else:
        table.append(1)
image = image.point(table,'1')
image.show()
text = pytesseract.image_to_string(image)
print(text)

checkCode.jpg(方便大家做实验用):

图片[7]-验证码的识别与爆破 – 作者:菜头想学安全-安全小百科图片[8]-验证码的识别与爆破 – 作者:菜头想学安全-安全小百科

运行结果中同样含有特殊字符,使用re正则匹配掉.

tesseract OCR的训练踩坑经历

1

tesseract num.font.exp0.tif num.font.exp0 batch.nochop makebox

会报错Empty page,改用下面的命令可以成功

tesseract num.font.exp0.tif num.font.exp0 -psm 7 batch.nochop makebox

2

如果要合并多个tiff文件,需要一直按住ctrl键进行选择

图片[9]-验证码的识别与爆破 – 作者:菜头想学安全-安全小百科3

训练貌似只支持黑白图像,验证码图片需要进行转灰度和二值化处理,以一张验证码图片为例

转灰度,二值化处理之前

图片[10]-验证码的识别与爆破 – 作者:菜头想学安全-安全小百科转灰度,二值化处理之后

图片[11]-验证码的识别与爆破 – 作者:菜头想学安全-安全小百科代码如下:

from PIL import Image

image = Image.open('./checkCode.jpg')
image =image.convert('L')
threshold = 60
table = []
for i in range(256):
    if i < threshold:
        table.append(0)
    else:
        table.append(1)
image = image.point(table,'1')
image.show()

每张图片需要的阈值有可能不同,需要自己调整代码中threshold的取值

编写爆破脚本

1:使用session = requests.Session()来保存一次会话

2:使用re正则匹配验证码的地址,将图片下载到本地

图片[12]-验证码的识别与爆破 – 作者:菜头想学安全-安全小百科使用pytesseract进行识别,保存识别结果,删除验证码图像

3:构造表单,发送数据.

4:没必要使用多线程,由于GIL的存在,对于这种IO密集型的代码,运行速度并不会提升多少甚至没有提升.

伤敌八百自损一千的奇淫巧计

可以借助第三方平台的API进行验证码的识别,第三方平台的验证码识别准确率很高,但是爆破成本太高了,且爆破成功率低,氪金大佬可以试试^^

总结

对于没有线条干扰的验证码识别准确率很高,但是对于有线条干扰的验证码识别准确率真的是十分感人,虽然可以通过转灰度,二值化处理提高准确率,但仍有些验证码无法准确识别.

如果有机器学习训练成功的师傅请指点俺一下^^

来源:freebuf.com 2021-06-28 15:52:42 by: 菜头想学安全

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论