4. 验证码滥用概述
验证码(CAPTCHA)最初的设计目标非常朴素:区分“人”和“机器”。但在真实攻防中,它早已不只是登录页上的一个输入框,而是贯穿注册、登录、短信发送、下单、领券、评论、投票、找回密码等关键业务节点的风控闸门。理解验证码滥用,核心不是记住某一种验证码长什么样,而是理解攻击者为什么盯着它、如何绕过它,以及绕过之后会对业务造成什么连锁影响。
一、验证码类型与防护强度分层
从工程视角看,验证码可以按“人机区分依据”分为几类。不同类别对应的攻击成本和防御收益差异很大,不能简单认为“越难越好”。
| 类型 | 典型形式 | 主要防御点 | 常见绕过方式 |
|---|---|---|---|
| 文本/图形验证码 | 扭曲字母数字、干扰线 | OCR 识别成本 | OCR、打码平台、深度学习识别 |
| 行为验证码 | 滑块、点选、轨迹 | 行为特征与轨迹真实性 | 轨迹模拟、浏览器自动化、真人打码 |
| 短信/邮件验证码 | 6 位数字、时效码 | 通道成本与频控 | 短信轰炸、接码平台、协议重放 |
| 无感验证 | 风险评分、设备指纹 | 环境与行为一致性 | 设备伪造、IP 代理、养号环境 |
这张表的关键结论是:验证码的强度不取决于“看起来多复杂”,而取决于攻击者获取“通过凭证”的成本。短信验证码看似简单,但如果接码平台能批量提供号码,其防护强度可能低于一个设计良好的行为验证码。
二、滥用动机:攻击者到底图什么
验证码滥用从来不是孤立行为,它通常服务于更大的黑产链条。常见动机包括:
- 资源薅取:批量注册账号领取新人券、试用额度、积分奖励,再通过转卖或套现获利。
- 短信轰炸与通道消耗:利用短信验证码接口对目标手机号进行高频发送,造成骚扰或直接消耗企业短信费用。
- 账号接管前置:通过撞库、枚举手机号,配合验证码绕过完成登录或改密。
- 数据爬取与内容污染:绕过评论、投票、问卷的验证码限制,批量灌水或刷量。
- 业务逻辑探测:用自动化脚本探测接口参数、频率限制和风控规则,为后续攻击铺路。
核心判断:当某个业务节点同时具备“可获利”和“验证码可绕过”两个条件时,它几乎必然会被滥用。防御方要优先保护的是高价值、低频次、可量化的节点,而不是所有页面都堆验证码。
三、自动化绕过的基本流程
攻击者绕过验证码通常不是“破解图片”这么单一,而是一条完整的流水线。典型流程如下:
- 接口发现:抓包分析验证码获取、校验、业务提交三个接口的调用关系。
- 凭证获取:通过 OCR、打码平台、接码平台或真人众包获得可通过的验证码答案。
- 会话保持:维持 Cookie、、设备指纹等上下文,确保验证码与业务请求绑定不被破坏。
- 频率规避:使用代理 IP 池、随机 UA、请求间隔抖动,绕过频控和风控评分。
- 批量执行:将验证码答案回填到业务请求中,完成注册、登录、发送或提交。
下面是一段简化的自动化请求示意,重点不是代码本身,而是观察“验证码获取”和“业务提交”之间的绑定关系:
POST /api/captcha/get HTTP/1.1
Host: target.example.com
Cookie: session=abc123
→ 返回: {"captchaId":"c_8891","image":"..."}
POST /api/captcha/verify HTTP/1.1
Content-Type: application/json
{"captchaId":"c_8891","answer":"7f3k"}
→ 返回: {"pass":true,"ticket":"t_5521"}
POST /api/user/register HTTP/1.1
Content-Type: application/json
{"phone":"138****0000","ticket":"t_5521"}
如果服务端只校验 ticket 是否存在,而不校验它是否与当前会话、设备、手机号绑定,那么攻击者就可以把一次通过的验证码票据复用到大量请求中。这是验证码滥用中最常见、也最容易被忽视的漏洞。
四、业务影响与典型场景
验证码被绕过后的影响往往不是“多了一些垃圾账号”这么简单,而是会沿着业务链路放大。
- 成本侧:短信通道被刷,单日费用可能从几百元飙升到数万元。
- 数据侧:虚假账号污染用户画像,导致推荐、风控、营销模型失真。
- 体验侧:正常用户被误伤,验证码越来越难,转化率下降。
- 合规侧:短信轰炸、账号盗用可能引发投诉与监管风险。
场景复盘:某活动页使用图形验证码保护“领取优惠券”接口。攻击者发现验证码答案与 captchaId 弱绑定,且票据可复用,于是用一次识别结果批量领取数万张券。事后复盘发现,问题不在图形复杂度,而在票据生命周期和业务绑定缺失。
五、常见误区与防御要点
在验证码滥用的防御中,以下误区非常普遍:
- 误区一:验证码越难越安全。过难会伤害真实用户,且对打码平台和深度学习模型而言,难度提升带来的成本增加有限。
- 误区二:只在前端加验证码。前端校验可被直接跳过,服务端必须独立校验并绑定业务上下文。
- 误区三:忽略票据复用。验证码通过后颁发的 ticket 必须一次性、短时效、强绑定。
- 误区四:只防注册不防发送。短信发送接口往往是成本最高的滥用入口,需要独立频控与风险评分。
防御要点:验证码只是风控的一层,不是全部。有效策略是“验证码 + 频控 + 设备指纹 + 行为评分 + 业务绑定”的组合。任何单点防御,在自动化流水线面前都容易被绕过。