[红日安全]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 漏洞危害

  1. 对账户进行暴力破解
  2. 任意用户登录
  3. 短信轰炸

3. 常见验证码漏洞

3.1 通用设计缺陷

3.1.1 验证码无效

  • 无论输入什么都判断验证码正确
  • 常见于小站点

3.1.2 验证码由客户端生成、验证

  • 验证码由客户端JS生成
  • 仅在客户端用JS验证

测试方法:判断验证码是否仅由客户端验证

3.1.3 验证码回显

  • 验证码在HTML或COOKIE中显示
  • 或输出到response headers的其他字段

测试方法:查看HTML源码或分析响应包

3.1.4 验证码固定(重复使用)

  • 验证码没有设使用期限
  • 首次认证成功后没有删除session中的验证码
  • 可被多次成功验证

测试方法

  1. 填写正确登录信息和验证码
  2. 抓取提交数据包
  3. 重复提交该数据包
  4. 登录成功则存在漏洞

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 安装步骤

  1. 下载地址:https://github.com/zhuifengshaonianhanlu/pikachu
  2. 放到WWW目录下
  3. 修改inc/config.inc.php中的数据库名和密码
  4. 访问http://localhost/pikachu-master/
  5. 点击初始化安装

4.2 手工测试案例

4.2.1 验证码绕过(on server)

测试结果:存在验证码固定(可重复使用)问题

测试过程

  1. 输入不正确的账户/密码及正确的验证码
  2. 重复提交数据包均返回用户名或密码错误
  3. 说明可绕过验证码直接暴力破解

源码分析

  • 验证后未删除session[vcode]
  • 导致下一个数据包输入该验证码也会判断正确

4.2.2 验证码绕过(on client)

测试结果:存在删除验证码参数可绕过问题

测试过程

  1. 查看源码发现前端JS判断验证码
  2. 输入正确验证码绕过前端判断
  3. 抓包后删除验证码参数
  4. 可对用户名和密码进行暴力破解

4.3 工具测试

4.3.1 PKAV HTTP Fuzzer

功能:对图片验证码进行识别

使用步骤

  1. 抓取登录包
  2. 复制url和请求包到PKav
  3. 设置变量和验证码
  4. 添加变量字典
  5. 设置图片验证码识别
  6. 设置重放选项
  7. 启动发包器

4.3.2 Burp插件reCAPTCHA

安装

  1. 下载地址:https://github.com/bit4woo/reCAPTCHA/releases
  2. Burpsuite中选择Extender->Extensions->Add
  3. 选择下载的reCAPTCHA.v0.8

5. CMS实战案例

5.1 CMSeasyv5.5

漏洞:删除cookie可绕过验证码

测试过程

  1. 使用正确账户密码+错误验证码登录
  2. 返回验证码错误
  3. 删除cookie后返回登陆成功

5.2 EmpireCMS_6.0

漏洞:验证码重复使用

测试过程

  1. 输入正确信息点击登录时抓包
  2. 通过修改imageField参数大小实现暴力提交
  3. 使用两位数数字字典作为payload
  4. 查看响应包确认登录成功

6. 修复建议

  1. 使用安全性强的验证码

    • 长度不低于4位
    • 同时包含数字、字母或汉字
    • 增加干扰因素
    • 避免容易被程序识别
  2. 验证码不应由客户端生成或返回到客户端

  3. 验证识别后销毁session中的验证码

  4. 限制用户提交的验证码不能为空

  5. 短信验证码规范

    • 不少于6位
    • 有效期不超过1分钟
    • 错误次数超过上限应锁定账户
验证码实战攻防教学文档 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分钟 错误次数超过上限应锁定账户