验证码绕过

简介

🤩现在的网站大多都有验证码的存在,系统的安全性得到进一步保障。但攻防永远都是一个对抗的过程,此文章就谈一谈如何对验证码进行绕过。

工具

  1. burpsuite
  2. ddddocr
  3. captcha-killer
  4. python

dddocr

ddddocr 是一个由sml2h3开发的专为验证码厂商进行对自家新版本验证码难易强度进行验证的一个python库。

python<=3.9直接用命令 pip install ddddocr 进行安装(笔者测试支持m1,2022年11月24号)

项目地址:https://github.com/sml2h3/ddddocr


captcha-killer

captcha-killer是一个burpsuite的插件,captcha-killer本身无法识别验证码,它专注于对各种验证码识别接口的调用

项目地址:https://github.com/c0ny1/captcha-killer

这个插件安装需要注意,如果burpsuite的版本在2020版之前,可以到上面的项目地址进行下载,但如果burpsuite版本在2020版及之后,则到上述项目地址下载后无法使用,可到如下地址下载:

https://github.com/Ta0ing/captcha-killer-java8

使用方法

1.运行dddocr

dddocr是一个库,使用的话需要编写脚本利用识别,附上脚本(脚本来源*雷神众测)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# encoding=utf-8
import os
from flask import Flask, request
import ddddocr
import base64
app = Flask(__name__)

@app.route('/api/upload', methods=['POST'])
def upload_pic():
data = request.form.get('image', '')
img_data = base64.b64decode(data)
with open('captcha.jpg', 'wb') as f:
f.write(img_data)

ocr = ddddocr.DdddOcr()
with open('captcha.jpg', 'rb') as f:
img_bytes = f.read()
res = ocr.classification(img_bytes)
return res

if __name__ == "__main__":
app.run(host="127.0.0.1",port=8991,debug=True)

备注:自己使用过程中,由于使用了anconda ,会出现一下报错

1
2
from jinja2 import escape
ImportError: cannot import name 'escape' from 'jinja2' (/Users/xxxxxx/opt/anaconda3/lib/python3.9/site-packages/jinja2/__init__.py)

经过排查原因是因为jinja2的版本太高了,需要降低版本,解决办法

1
pip install jinja2==2.8

运行成功截图

这个脚本利用flask框架开启一个web服务,到时候captcha-killer插件会将验证码图片通过这个web服务传过来,然后脚本对验证码图片进行解析,将解析结果返回。

2.抓取验证码请求包发送到插件

3.将此数据包发送到插件captcha-killer 中

如果可以成功获取验证码说明成功

3.配置接口,发送请求调用dddocr

这里给出请求包格式(来源于*雷神众测)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
POST /api/upload HTTP/1.1
Host: 127.0.0.1:8991
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:99.0) Gecko/20100101 Firefox/99.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, br
Referer: http://127.0.0.1:8991/api/upload
Content-Type: application/x-www-form-urlencoded
Content-Length: 9
Origin: http://127.0.0.1:8991
Connection: keep-alive
Cookie: ll=108296; BAIDUID=FEA7B3A131CE38315D6659E087861E2B:FG=1; BIDUPSID=FEA7B3A131CE38313A9C5BD381345226; PSTM=1644314147; channel=127.0.0.1:8084; baikeVisitId=229b0def-020a-4bf9-9635-3bb7a01623ca
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: same-origin
Sec-Fetch-User: ?1

image=<@URLENCODE><@BASE64><@IMG_RAW></@IMG_RAW></@BASE64></@URLENCODE>

4.接口URL填写第一步开启脚本时使用的IP和端口

点击识别即可识别出验证码

5.到这一步说明已经配置完成啦,接下来就可以进行验证码绕过爆破,首先在登录接口输入账号密码验证码抓取请求包,发送到intruder模块,使用pitchfork攻击类型,设置密码和验证码为变量

6.然后在位置一设置为密码字典,位置二选择有效载荷类型为通过扩展生成,然后选择captcha-killer这个插件扩展

现在就可以开始爆破了


可以看到并不是验证码输入不正确,验证码绕过成功。