验证码识别
- 有的网站为了防止代码、机器进行自动攻击,加入了验证码。
验证码的作用与分类
-
验证码的作用:
- 验证身份:验证是否为用户本人
- 触发二次验证的敏感操作:
- 异地登录、修改密码、注销等操作
- 验证行为:区分当前操作是人类,还是机器人
- 使用代码等手段发起批量自动化的操作
- 触发操作:投票、抢购、爬虫、注册、发帖等
- CAPTCHA:【全自动区分计算机和人类的图灵测试】
- 验证身份:验证是否为用户本人
-
验证码的分类:
- 静态验证码:EG.图片验证码、问答式验证码等
- 行为式验证码:E.G.鼠标的点击、拖动滑块等
- 浏览器:对用户拖动滑块的动作进行了信息的收集(例如:对此接口的访问频率,用户访问此网页的地理位置、浏览器、IP信息,拖动轨迹、拖动速度等)
- 间接式验证码:通过短信、邮电、语音等
- 脱离当前的网页,需要依赖其他的设备、系统(例如短信、邮箱等)。
- 无感验证码【最高级的验证码】
- 用户在使用时,用户并不知道在此操作下隐藏着身份的认证。
- 无感验证仅在存在风险时,出现提示。
- 原理:在用户进行此操作时,默默收集用户行为特征的信息,来对用户进行认证。
验证码的实现原理
-
本地PHP代码来分析:
-
从PHP代码角度来分析验证码的实现原理(示例)
-
P.S、从前端的登录页面开始分析:login.html
P.S、从验证码的生成文件来分析:yanzhengma.php
P.S、从服务器后端的验证来分析:login.php
-
利用第三方识别服务
-
【付费】接入第三方服务来实现验证码的识别服务
- 例如:网易网盾、腾讯验证码、阿里云验证码等。
-
验证码识别技术
- OCR【光学字符识别】:用代码来自动识别图片中的内容的技术
- 例如:识别和提取pdf文件中,内容由拍照生成的图片中的文字。
- utools工具:
- 原理:在utools软件中,调用一个远程接口,将图片发送到服务器上进行识别,识别完毕后,将结果响应给客户端。
- OCR识别的接口/代码:esayocr组件【免费、开源】
- github.com/jaidedai/easyocr
安装esayocr组件
P.S、在cmd中运行:pip install easyocr【在本地安装easyocr】
【可以使用下述方法:加速安装】
P.S、在本地安装好easyocr后,编写一段代码来实现【本地验证码识别服务】
P.S、运行代码easy_ocr.py即可得到验证码:
注意:初次运行时,会很慢很慢很慢……超级慢【等待的时间我去吃饭了,回来就好了。】
easyocr识别服务的准确性
<1、将下载出来的验证码与easyocr识别出来的验证码进行比对:
P.S.很遗憾,识别并不是很准
<2、对含英文的图片进行识别
在试一试easyocr自带的示例
P.S、对上述代码进行略微修改
P.S、识别出的结果还不错
<3、对含中文的图片进行识别
略微修改代码:
P.S、识别的结果也还是不错的。
<4、对含数字的图片再次识别
略微修改代码
P.S、从结果上看,easyocr对于数字的识别仍然存在错误率。
BP插件识别验证码爆破
- 在使用BP进行密码暴力破解时,可以安装插件,来自动实现验证码的识别与填入。
- 【即在BP中使用插件,集成验证码识别功能,来实现自动化的密码爆破】
示例:使用BP插件识别验证码爆破
0、插件captcha-killer-modified的下载
解压缩后,放置到本地目录下
1、启动BP,并在BP的Extensions模块中安装JAVA的jar包
P.S、安装好后,在BP中增加了一个captcha-killer-modified选项卡【用于对识别内容的配置】
2、运行压缩包中的codereg.py的代码,以启动本地验证码识别服务(即ddddocr服务)。
补充:
P.S1、启动的本地识别服务监听了本机的8888端口:
将待识别图片的地址(或编码后图片的内容)发送到8888的端口,本地服务识别服务在识别完毕后,返回响应结果。
P.S、此服务使用的组件为:ddddocr可支持多种验证码类型的识别。
P.S2、插件captcha-killer-modified与ddddocr服务的关系:
①插件captcha-killer-modified:仅仅提供一个框架流程,即可以将待识别图片的地址按照自定义的格式发送给任何一个第三方验证码识别平台【网易网盾、本地的ddddocr、其他的打码平台等等】。
②接口URL:使用的哪个验证码识别服务,则填写相应接口地址。
【此处固定接口为:http://127.0.0.1:8888 】
③Request template:填写对应服务商规定的固定格式。【固定格式】
【固定格式如下:】
POST /reg HTTP/1.1
Host: 127.0.0.1:8888
Authorization:Basic f0ngauth
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:97.0) Gecko/20100101 Firefox/97.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: keep-alive
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
Content-Length: 8332
<@BASE64><@IMG_RAW></@IMG_RAW></@BASE64>
P.S、将上述服务商的固定模板填入下方红框中即可。
填入此段内容后可实现:将图片内容会经过base64编码,并以base64的形式发送到本地8888端口,识别完毕后,显示识别的结果。
【P.S、此处不太理解也不用心急,有个印象即可,继续向后浏览,在文章后面会有详细的解释使用步骤】
所以,插件captcha-killer-modified是一个灵活的、可以使用任何的第三方服务的接口。而不是仅仅只能使用ddddocr的识别服务。
P.S3、初次运行时可能会出现以下的报错:
<1、没有安装模块ddddocr
P.S、若安装速度过慢:可采用国内镜像安装下载
<2、没有安装模块aiohttp
<3、出现codereg.py代码报错
P.S.修改报错行的代码:
【将第11行的代码中,default值由原来的字符型”8888”改为int型的8888即可】
3、抓验证码的数据包
【推荐:使用BP自带的浏览器来访问(不会出现其他本不该被拦截到的内容)】
P.S.即获取到一个验证码的数据包
P.S、将此数据包发送到captcha-killer-modified插件中
P.S、连续点击‘获取’按钮,若获取到的验证码可正常刷新,则抓到的验证码包没有问题。
4、配置验证码识别服务
【此处使用本地的ddddocr服务】
【将验证码发送到本地的ddddocr服务进行识别】
P.S、填入此段内容的目的:图片内容会经过base64编码,以base64的形式发送到本地8888端口,识别完毕后,将识别的结果返回。
P.S、点击‘识别’按钮。
P.S、‘获取’一个新的验证码、发送‘识别’。
5、将配置好的插件captcha-killer-modified集成到BP爆破的流程中
攻击流程:
P.S、抓登录的HTTP数据包
P.S、将获取到的登录包发送到Intruder模块
P.S、选择攻击类型为:Pitchfork
【选择的原因,见之前的文章】
P.S、设置攻击的字段:【密码的值、验证码的值】
P.S、配置Payloads
<1、密码字段的值:采用简单列表的密码字典来爆破
<2、验证码字段的值:采用captcha-killer-modified插件
P.S、配置线程池【只能使用单线程,若使用多线程,则在服务器端保存验证码时,会出现值的覆盖,仅有最后一次的验证码可正常使用】
P.S、其他设置保持默认即可,发起攻击
P.S、点击Length长度进行排序,得到一个成功率较大的用户名/口令值:admin/123456
点击查看请求数据包4的相应内容(Response),可发现登录成功后,又自动跳转到index.php登录界面。【很正常,因为在网页制作时,没有对登录成功后的逻辑进行设置】
用户/口令值的验证:
P.S、验证方式:【可查看此网页数据库中的用户表】或【在登录页面中进行验证】
P.S、登录成功后,又跳转到的登录界面
可能遇到的问题:
<1、响应结果中字体显示出现乱码
解决方法:
<2、无法爆破出任何正确的结果
【此时出现了验证码之间顺序的交叉,即使是正确的口令值也不能成功爆破】
P.S、正确的口令值123456也没有被识别出来。
解决方法:
①重启BP并配置captcha-killer-modified插件、②重启ddddocr服务【即在运行codereg.py代码】
P.S、与上述相同的步骤,但重启BP、ddddocr服务后、即可出现爆破成功。【经过多次试验,得出的经验】
-
BP插件识别验证码爆破的小结:
- 在BP中安装插件captcha-killer-modified:
- github.com/f0ng/captcha-killer-modified
- 启动本地验证码识别的服务
- cmd/执行python文件codereg.py【来启动验证码识别服务】
- 在BP中抓验证码的包,并发送到插件模块中【右键/Extensions/captcha-killer-modified/captcha-killer/Send to captcha panel】
- 使用BP中自带的浏览器
- 在插件模块中,配置图片识别服务的模板
- 抓到登录的包,开始爆破。
- 将配置好的插件集成到intruder模块
- 在BP中安装插件captcha-killer-modified: