OCR-验证码自动识别

验证码获取测试接口:https://data.gdcic.net/Dop/CheckCode.aspx?codemark=408.15173910730016

BurpSuite插件-CaptchaKiller

原 GitHub 项目地址:https://github.com/c0ny1/captcha-killer
修改版 GitHub 项目地址:https://github.com/f0ng/captcha-killer-modified

image.png
image.png使用说明:https://gv7.me/articles/2019/burp-captcha-killer-usage/

  • 将获取验证码的数据包发送到插件

使用burp抓取获取验证码数据包,然后右键 captcha-killer -> send to captcha panel发送数据包到插件的验证码请求面板。image.png
然后到切换到插件面板,点击获取即可拿到要识别的验证码图片内容。
image.png
注意:获取验证码的 cookie 一定要和 intruder 发送的 cookie 相同!

  • 配置识别接口的地址和请求包

拿到验证码之后,就要设置接口来进行识别了。我们可以使用网上寻找免费的接口,也可以本地起一个验证码识别的服务。

部署

image.png

使用

数据包:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
POST /reg HTTP/1.1
Host: 127.0.0.1:8888
Connection: close
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Sec-Fetch-Site: none
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Content-Type: application/x-www-form-urlencoded
Content-Length: 55

<@BASE64><@IMG_RAW></@IMG_RAW></@BASE64>

然后我们把图片内容的位置用标签来代替。比如该例子使用的接口是post提交image参数,参数的值为图片二进制数据的 base64 编码后的 url 编码。那么 Request template(请求模版)面板应该填写如下:
image.png

ID 标签 描述
1 <@IMG_RAW></@IMG_RAW> 代表验证码图片原二进制内容
2 <@URLENCODE></@URLENCODE> 对标签内的内容进行url编码
3 <@BASE64></@BASE64> 对标签内的内容进行base64编码

后点击“识别”即可获取到接口返回的数据包,同时在 request raw 可以看到调用接口最终发送的请求包。
image.png
勉强够用
image.png
若返回包是 json,使用 Regular expression (正则表达式)来匹配,然后选择 匹配结果 右键标记为识别结果 ,系统会自动生成正则表达式规则。
image.png
将模版保存
image.png
Intruder 模块调用
image.png

ddddocr

简介

项目地址:https://github.com/sml2h3/ddddocr
使用 ocr_api_server 一键启动识别服务:https://github.com/sml2h3/ocr_api_server

  • 最简单运行方式

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    # 安装依赖
    pip install -r requirements.txt -i https://pypi.douban.com/simple
    # 运行 可选参数如下
    # --port 9898 指定端口,默认为9898
    # --ocr 开启ocr模块 默认开启
    # --old 只有ocr模块开启的情况下生效 默认不开启
    # --det 开启目标检测模式

    # 最简单运行方式,只开启ocr模块并以新模型计算
    python ocr_server.py --port 9898 --ocr
    # 开启ocr模块并使用旧模型计算
    python ocr_server.py --port 9898 --ocr --old
    # 只开启目标检测模块
    python ocr_server.py --port 9898 --det
    # 同时开启ocr模块以及目标检测模块
    python ocr_server.py --port 9898 --ocr --det
    # 同时开启ocr模块并使用旧模型计算以及目标检测模块
    python ocr_server.py --port 9898 --ocr --old --det
  • docker 运行方式(目测只能在 Linux 下部署)

    1
    2
    3
    4
    5
    6
    7
    8
    git clone https://github.com/sml2h3/ocr_api_server.git 
    cd ocr_api_server
    # 修改entrypoint.sh中的参数,具体参数往上翻,默认9898端口,同时开启ocr模块以及目标检测
    模块
    # 编译镜像
    docker build -t ocr_server:v1 .
    # 运行镜像
    docker run -p 9898:9898 -d ocr_server:v1

接口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 1、测试是否启动成功,可以通过直接GET访问http://{host}:{port}/ping来测试,如果返回 pong则启动成功
# 2、OCR/目标检测请求接口格式:
# http://{host}:{port}/{opt}/{img_type}/{ret_type}
# opt:操作类型 ocr=OCR det=目标检测 slide=滑块(match和compare两种算法,默认为 compare)
# img_type: 数据类型 file=文件上传方式 b64=base64(imgbyte)方式 默认为file方式
# ret_type: 返回类型 json=返回json(识别出错会在msg里返回错误信息) text=返回文本格式 (识别出错时回直接返回空文本)
# 例子:
# OCR请求
# resp = requests.post("http://{host}:{port}/ocr/file", files={'image': image_bytes})
# resp = requests.post("http://{host}:{port}/ocr/b64/text", data=base64.b64encode(file).decode())
# 目标检测请求
# resp = requests.post("http://{host}:{port}/det/file", files={'image': image_bytes})
# resp = requests.post("http://{host}:{port}/ocr/b64/json", data=base64.b64encode(file).decode())
# 滑块识别请求
# resp = requests.post("http://{host}:{port}/slide/match/file", files= {'target_img': target_bytes, 'bg_img': bg_bytes})
# jsonstr = json.dumps({'target_img': target_b64str, 'bg_img': bg_b64str}) # resp = requests.post("http://{host}:{port}/slide/compare/b64", files=base64.b64encode(jsonstr.encode()).decode())

部署

  1. 安装下载项目依赖

    1
    2
    git clone https://github.com/sml2h3/ocr_api_server.git
    python3 -m pip install -r requirements.txt -i https://pypi.douban.com/simple
  2. 运行开启

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # 最简单运行方式,只开启ocr模块并以新模型计算 
    python3 ocr_server.py --port 9898 --ocr
    # 开启ocr模块并使用旧模型计算
    python3 ocr_server.py --port 9898 --ocr --old
    # 只开启目标检测模块
    python3 ocr_server.py --port 9898 --det
    # 同时开启ocr模块以及目标检测模块
    python3 ocr_server.py --port 9898 --ocr --det
    # 同时开启ocr模块并使用旧模型计算以及目标检测模块
    python3 ocr_server.py --port 9898 --ocr --old --det

    image.png
    image.png
    image.png

  3. 接口格式类型

常用请求模版:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
POST /ocr/b64/text HTTP/1.1
Host: 127.0.0.1:9898
Connection: close
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5)
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36
Accept:
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,
*/*;q=0.8,application/signed-exchange;v=b3
Sec-Fetch-Site: none
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Content-Length: 113
<@BASE64><@IMG_RAW></@IMG_RAW></@BASE64>

识别准确率还是可以的
image.png


OCR-验证码自动识别
https://52hertz.tech/2023/08/03/OCR_Captcha/
作者
Ustin1an
发布于
2023年8月3日
许可协议