[红日安全]Web安全Day14 - 验证码实战攻防
字数 2417 2025-08-18 11:39:23
验证码实战攻防教学文档
1. 验证码概述
1.1 验证码定义
验证码(CAPTCHA)是"Completely Automated Public Turing test to tell Computers and Humans Apart"(全自动区分计算机和人类的图灵测试)的缩写,是一种区分用户是计算机还是人的公共全自动程序。
1.2 验证码作用
- 防止恶意破解密码
- 防止刷票
- 防止论坛灌水
- 防止业务安全防刷
1.3 验证码分类
1.3.1 图片验证码
- 随机产生数字、英文字母、汉字或问题
- 通常4位或6位字符
- 通过干扰线、噪点、字符粘连和旋转增加识别难度
1.3.2 手机短信验证码
- 发送验证码到用户手机
- 常用于购物网站和重要业务验证
- 由验证码接入商提供服务
1.3.3 行为式验证码
- 拖动式验证码:类似手机滑动解锁
- 点触式验证码:点击图片中与文字描述相符的内容
1.3.4 语音验证码
- 通过语音电话播报验证码
- 解决短信到达率问题
- 用于银行金融等高安全场景
1.3.5 视频验证码
- 随机数字、字母和中文组合嵌入视频
- 动态变换,随机响应
- 防范字典攻击、穷举攻击
2. 验证码漏洞概述
2.1 漏洞原理
由于验证码生成机制或验证机制存在缺陷引发的问题。
2.2 漏洞危害
- 对账户进行暴力破解
- 任意用户登录
- 短信轰炸
3. 常见验证码漏洞
3.1 通用设计缺陷
3.1.1 验证码无效
- 无论输入什么都判断验证码正确
- 常见于小站点
3.1.2 验证码由客户端生成、验证
- 验证码由客户端JS生成
- 仅在客户端用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. 靶场测试
4.1 Pikachu漏洞平台
4.1.1 平台介绍
包含常见web安全漏洞的Web应用系统
4.1.2 安装步骤
- 下载地址:https://github.com/zhuifengshaonianhanlu/pikachu
- 放到WWW目录下
- 修改inc/config.inc.php中的数据库名和密码
- 访问http://localhost/pikachu-master/
- 点击初始化安装
4.2 手工测试案例
4.2.1 验证码绕过(on server)
测试结果:存在验证码固定(可重复使用)问题
测试过程:
- 输入不正确的账户/密码及正确的验证码
- 重复提交数据包均返回用户名或密码错误
- 说明可绕过验证码直接暴力破解
源码分析:
- 验证后未删除session[vcode]
- 导致下一个数据包输入该验证码也会判断正确
4.2.2 验证码绕过(on client)
测试结果:存在删除验证码参数可绕过问题
测试过程:
- 查看源码发现前端JS判断验证码
- 输入正确验证码绕过前端判断
- 抓包后删除验证码参数
- 可对用户名和密码进行暴力破解
4.3 工具测试
4.3.1 PKAV HTTP Fuzzer
功能:对图片验证码进行识别
使用步骤:
- 抓取登录包
- 复制url和请求包到PKav
- 设置变量和验证码
- 添加变量字典
- 设置图片验证码识别
- 设置重放选项
- 启动发包器
4.3.2 Burp插件reCAPTCHA
安装:
- 下载地址:https://github.com/bit4woo/reCAPTCHA/releases
- Burpsuite中选择Extender->Extensions->Add
- 选择下载的reCAPTCHA.v0.8
5. CMS实战案例
5.1 CMSeasyv5.5
漏洞:删除cookie可绕过验证码
测试过程:
- 使用正确账户密码+错误验证码登录
- 返回验证码错误
- 删除cookie后返回登陆成功
5.2 EmpireCMS_6.0
漏洞:验证码重复使用
测试过程:
- 输入正确信息点击登录时抓包
- 通过修改imageField参数大小实现暴力提交
- 使用两位数数字字典作为payload
- 查看响应包确认登录成功
6. 修复建议
-
使用安全性强的验证码
- 长度不低于4位
- 同时包含数字、字母或汉字
- 增加干扰因素
- 避免容易被程序识别
-
验证码不应由客户端生成或返回到客户端
-
验证识别后销毁session中的验证码
-
限制用户提交的验证码不能为空
-
短信验证码规范
- 不少于6位
- 有效期不超过1分钟
- 错误次数超过上限应锁定账户