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

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

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判断验证码
  • 存在删除验证码参数可绕过问题
  • 测试步骤:
    1. 输入正确验证码绕过前端判断
    2. 抓包后删除验证码参数
    3. 暴力破解用户名和密码

5. 工具测试

5.1 PKAV HTTP Fuzzer

  • 图片验证码识别工具
  • 测试EmpireCMS_6.0步骤:
    1. 抓取登录包
    2. 复制到PKav目标数据
    3. 设置变量和验证码
    4. 添加字典
    5. 设置图片验证码识别
    6. 启动发包

5.2 Burp插件reCAPTCHA

  • 下载地址:https://github.com/bit4woo/reCAPTCHA/releases
  • 安装:Burpsuite Extender中添加插件
  • 使用:Proxy中右键Send to reCAPTCHA

6. CMS实战案例

6.1 CMSeasyv5.5

  • 漏洞:删除cookie可绕过验证码
  • 测试步骤:
    1. 输入正确账户密码+错误验证码
    2. 返回验证码错误
    3. 删除cookie后登录成功
  • 危害:非管理员可绕过验证码爆破

6.2 EmpireCMS_6.0

  • 漏洞:验证码重复使用
  • 测试步骤:
    1. 输入正确信息抓包
    2. 修改imageField参数暴力提交
    3. 查看响应包是否登录成功
  • 结果:暴力提交均登录成功

7. 修复建议

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

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

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

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

  5. 短信验证码安全要求:

    • 不少于6位
    • 有效期不超过1分钟
    • 错误次数超限锁定账户
验证码实战攻防教学文档 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) 验证码有验证、无回显 存在验证码固定问题 可绕过验证码直接暴力破解 源码分析: 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分钟 错误次数超限锁定账户