[红日安全]Web安全Day14 - 验证码实战攻防
字数 2014 2025-08-25 22:58:55
验证码实战攻防教学文档
1. 验证码概述
验证码(CAPTCHA)是"Completely Automated Public Turing test to tell Computers and Humans Apart"(全自动区分计算机和人类的图灵测试)的缩写,是一种区分用户是计算机还是人的公共全自动程序。
1.1 验证码作用
- 防止恶意破解密码
- 防止刷票
- 防止论坛灌水
- 有效防止攻击者对某一场景使用暴力方式进行不断的攻击尝试
- 主要运用于登录、注册、评论发帖及业务安全防刷等场景
1.2 验证码分类
1.2.1 图片验证码
- 在图片上随机产生数字、英文字母、汉字或问题
- 通常4位或6位字符
- 通过干扰线、噪点、字符粘连和旋转增加识别难度
- 传统验证码易被OCR技术破解
1.2.2 手机短信验证码
- 发送验证码到用户手机
- 常用于购物网站保证安全性
- 由验证码接入商提供统一服务
1.2.3 行为式验证码
- 拖动式验证码:类似手机滑动解锁
- 点触式验证码:点击图片中与文字描述相符的内容
1.2.4 语音验证码
- 通过语音电话播报验证码
- 解决短信到达率问题
- 用于银行金融等高安全性场景
1.2.5 视频验证码
- 随机组合嵌入视频中
- 动态变换,随机响应
- 防范字典攻击、穷举攻击
2. 验证码漏洞概述
2.1 漏洞原理
由于验证码生成机制或验证机制存在缺陷引发的问题。
2.2 漏洞危害
- 对账户进行暴力破解
- 任意用户登录
- 短信轰炸
3. 常见验证码漏洞
3.1 通用设计缺陷
3.1.1 验证码无效
- 无论输入什么都判断验证码正确
- 小站点可能存在
3.1.2 验证码由客户端生成、验证
- 客户端JS生成并验证
- 测试方法:判断是否仅由客户端验证
3.1.3 验证码回显
- 在HTML或COOKIE中显示
- 或输出到response headers
- 测试方法:查看HTML源码或分析响应包
3.1.4 验证码固定(重复使用)
- 验证码无使用期限
- 首次认证成功后未删除session中的验证码
- 测试方法:重复提交正确数据包
3.1.5 验证码可爆破
- 服务端未对验证时间、次数限制
- 测试方法:Burpsuite暴力破解
3.1.6 验证码可猜测
- 验证码设置简单(纯数字或字母)
- 设定范围有限
- 测试方法:根据已有验证码猜测范围
3.1.7 验证码可绕过
- 逻辑设计缺陷导致绕过
- 绕过方式:
- 删除COOKIE
- 验证码参数为空
- 删除验证码参数
- 修改Response状态值
- 测试方法:Burpsuite更改请求包
3.2 图片验证码漏洞
- 设计过于简单
- 可使用工具自动化识别
- 测试工具:
- Python Image Library
- tesseract-ocr
- pytesser
3.3 短信验证码漏洞
常见于注册登录、密码找回、敏感信息修改等模块
3.3.1 短信轰炸
- 未对发送时间、用户及IP限制
- 测试方法:Burpsuite重放
3.3.2 任意用户注册
- 未将短信验证码与手机绑定
- 通过更改手机号填写
3.3.3 任意用户重置密码
- 密码找回模块常见
- 未绑定短信验证码与手机
- 或未绑定手机号与账号
4. 靶场测试(Pikachu)
4.1 验证码绕过(on server)
- 验证码有验证、无回显
- 存在验证码固定问题
- 可绕过验证码直接暴力破解
源码分析:
// 用户名、密码和验证码均不为空
if(!empty($_POST['submit']) && !empty($_POST['username']) && !empty($_POST['password']) && !empty($_POST['vcode'])){
// 判断输入验证码是否与session中的验证码相同
if(strtolower($_POST['vcode']) == strtolower($_SESSION['vcode'])){
// 但比较完后没有删除session[vcode]
// 导致验证码可重复使用
}
}
4.2 验证码绕过(on client)
- 前端JS判断验证码
- 存在删除验证码参数可绕过问题
- 测试步骤:
- 输入正确验证码绕过前端判断
- 抓包后删除验证码参数
- 暴力破解用户名和密码
5. 工具测试
5.1 PKAV HTTP Fuzzer
- 图片验证码识别工具
- 测试EmpireCMS_6.0步骤:
- 抓取登录包
- 复制到PKav目标数据
- 设置变量和验证码
- 添加字典
- 设置图片验证码识别
- 启动发包
5.2 Burp插件reCAPTCHA
- 下载地址:https://github.com/bit4woo/reCAPTCHA/releases
- 安装:Burpsuite Extender中添加插件
- 使用:Proxy中右键Send to reCAPTCHA
6. CMS实战案例
6.1 CMSeasyv5.5
- 漏洞:删除cookie可绕过验证码
- 测试步骤:
- 输入正确账户密码+错误验证码
- 返回验证码错误
- 删除cookie后登录成功
- 危害:非管理员可绕过验证码爆破
6.2 EmpireCMS_6.0
- 漏洞:验证码重复使用
- 测试步骤:
- 输入正确信息抓包
- 修改imageField参数暴力提交
- 查看响应包是否登录成功
- 结果:暴力提交均登录成功
7. 修复建议
-
使用安全性强的验证码:
- 长度不低于4位
- 同时包含数字、字母或汉字
- 增加干扰因素
- 避免易被程序识别
-
验证码不应由客户端生成或返回到客户端
-
验证识别后销毁session中的验证码
-
限制用户提交的验证码不能为空
-
短信验证码安全要求:
- 不少于6位
- 有效期不超过1分钟
- 错误次数超限锁定账户