【八个月网安课程】第十周·周三:验证码绕过基础——复用、置空与本地靶场实践
以下是第十周周三学习内容。验证码CAPTCHA本应是防御自动化攻击的最后一道防线但错误的实现反而会成为渗透者的突破口。今天你将深入理解验证码的生成与验证机制掌握复用、置空等经典绕过手法并在本地靶场中亲手验证这些缺陷。第十周·周三验证码绕过基础——复用、置空与本地靶场实践 今日学习目标达成效果能解释验证码的核心作用区分人类操作与自动化脚本防止暴力破解、垃圾注册与数据爬取能分析验证码验证流程中常见的安全缺陷服务端未绑定 Session、验证后未销毁、空值校验缺失、客户端返回验证码文本等能独立实现“验证码复用”攻击在 DVWA 或自建靶场中使用同一验证码多次提交不同密码绕过验证码保护完成爆破能演示验证码置空绕过通过将验证码参数值置空或删除参数测试后端是否因缺少校验而直接放行能使用 BurpSuite捕获并分析带验证码的登录请求通过 Repeater 手工验证绕过思路再使用 Intruder 配合固定验证码进行批量攻击能从防御视角总结安全验证码的实现要点绑定会话、单次有效、随机生成、后端校验并知晓验证码不能替代账户锁定、多因素认证等深度防御机制。 一、验证码的攻防定位验证码全自动区分计算机和人类的公开图灵测试被广泛应用于登录、注册、投票、搜索等场景。理想状态下验证码文本应随机生成难以被 OCR 或 AI 识别每个验证码仅对应一次请求一次性令牌严格在服务端生成并验证客户端仅获取图像或混淆后的数据一旦验证通过或失败立即失效不允许重复使用。现实中的开发疏漏常常导致验证码形同虚设。今天你将学习的不是图像识别而是逻辑绕过——因为开发者在验证码的处理逻辑上留下了缺口。 二、常见验证码绕过手法1. 验证码复用Captcha Reuse成因服务端在用户首次获取验证码时生成一个验证码值并存入 Session但在验证成功后未将其销毁或未将验证码与当前用户会话紧密绑定更新。导致攻击者可以合法获取一次验证码例如手动识别一次然后在自动化脚本中反复使用同一个验证码值。攻击流程访问登录页面获取验证码图片肉眼识别出A3B2。提交登录请求usernameadminpassword123captchaA3B2登录失败但验证码校验通过实际上取决于服务端逻辑。更常见的是登录失败后验证码未失效攻击者可以在 Burp Intruder 中固定验证码值为A3B2循环爆破密码。即使密码错误只要验证码不变请求就不会因验证码被拒从而绕过防爆破机制。关键点验证码在一次失败的认证尝试后仍可复用说明验证码的生命周期未正确管理。2. 验证码置空Empty Captcha成因后端代码仅对验证码参数进行了“存在性”校验或者在校验前未判断参数是否为空或者默认处理将空值视为有效。攻击方式在请求中直接删除captcha参数或将参数值设为空字符串captcha。如果后端发现验证码为空时直接跳过校验常见于开发调试后忘记移除的“万能验证码”或默认放行逻辑攻击者无需输入任何验证码即可无限爆破。典型后端漏洞代码PHPif($_POST[captcha]$_SESSION[captcha]){// 验证成功}// 如果某个分支缺少 else 或未处理空值可能出现绕过3. 验证码不绑定 Session验证码文本被硬编码为固定字符串或不同用户共享相同的验证码如存储在全局变量中而非 Session 中。这导致攻击者可以识别一次验证码后永久使用。4. 验证码在客户端校验使用 JavaScript 进行验证码比对或直接在 HTML 隐藏域、Cookie 中以明文形式存储验证码结果。攻击者直接读取即可。验证方法查看网页源码、抓包分析响应中是否包含验证码明文字段。5. 验证码刷新机制缺陷部分验证码只在页面加载时生成没有“刷新”按钮或刷新机制仅在前端隐藏图片。导致验证码长时间不变增加了复用攻击的窗口期。✍️ 三、动手实践一验证码复用绕过以简单 PHP 靶场为例1. 搭建含缺陷验证码的靶场创建captcha_login.php使用 PHP 内置会话?phpsession_start();// 仅在未设置验证码时生成且永不销毁模拟复用缺陷if(!isset($_SESSION[captcha])){$_SESSION[captcha]substr(md5(rand()),0,4);}// 处理登录$msg;if($_SERVER[REQUEST_METHOD]POST){$user$_POST[username]??;$pass$_POST[password]??;$cap$_POST[captcha]??;// 缺陷1验证码验证仅在不为空时进行且不销毁if($cap$cap!$_SESSION[captcha]){$msg验证码错误。;}else{// 缺陷2验证码验证通过后不销毁可重复使用if($useradmin$passsecret){$msg登录成功;}else{$msg用户名或密码错误。;}}}?!DOCTYPEhtmlhtmlheadmeta charsetUTF-8title验证码缺陷靶场/title/headbodyh2登录验证码复用演示/h2form methodpost用户名:input typetextnameusernamebr密码:input typepasswordnamepasswordbr验证码:input typetextnamecaptcha?phpecho当前验证码.$_SESSION[captcha];?brinput typesubmitvalue登录/formp?phpecho$msg;?/p/body/html将文件放入 Web 目录访问确认显示验证码。漏洞分析验证码只有在第一次访问页面时生成之后只要不刷新页面不重新请求captcha_login.phpSession 中的验证码保持不变。验证码校验后未调用unset($_SESSION[captcha])导致复用。并且代码中如果$cap为空即不传验证码参数直接跳过验证码校验因为$cap 条件为假存在置空绕过。2. 手动验证复用浏览器打开页面记录验证码abc1举例。在 Burp 中抓取登录 POST 请求验证码固定为abc1。使用 Intruder 爆破密码验证码值始终设为abc1。观察即使密码多次错误也不会因验证码被拦截。最终找到正确密码secret时登录成功。思考如果验证码在一次错误后立即失效爆破还能成功吗显然不能。✍️ 四、动手实践二验证码置空绕过1. 利用上述代码的第二个缺陷在 Burp Repeater 中将 POST 请求中的captcha参数完全删除或设置为captcha空值发送请求。观察是否返回“验证码错误”。如果返回的是“用户名或密码错误”则证明验证码校验被跳过置空绕过成功。2. 结合爆破在 Intruder 中直接使用不携带验证码参数的请求模板或者将验证码值固定为空字符串进行密码爆破。无论验证码为何只要后端逻辑不校验空值攻击就能无视验证码。✍️ 五、动手实践三在 DVWA CAPTCHA 关卡测试可选DVWA 包含 CAPTCHA 关卡需 PHP GD 库支持。若你的 DVWA 已启用该模块Low 难度可能验证码复用的缺陷明显验证码不失效甚至可随意修改step参数跳过。Medium 难度可能涉及passed_captcha隐藏字段前端控制验证状态同样可被篡改。High 难度通常结合了 CSRF Token 与验证码绕过难度较高需组合宏。我们重点演示 Low 级别进入 DVWA CAPTCHA确认登录需验证码。提交一次登录在 Burp History 中发现请求包含captcha参数。使用同一验证码多次修改密码参数尝试爆破确认验证码可复用。 六、课后测试题与解析测试题 1什么是验证码复用漏洞请说明其产生原因与攻击方法。参考答案验证码复用漏洞是指服务器在处理登录或敏感操作时对同一个验证码允许多次使用而不会在验证成功或失败后使其失效。产生原因通常是 Session 中的验证码未在验证后清除或未随失败尝试重新生成。攻击者只需人工识别一次验证码即可在自动化工具如 Burp Intruder中固定该验证码对目标账户进行穷举密码攻击完全绕过了验证码防止暴力破解的初衷。测试题 2如何通过置空绕过验证码请写出可能的后端逻辑缺陷。参考答案攻击者将登录请求中的验证码参数值设为空字符串或直接删除该参数。如果后端代码的验证逻辑类似if ($_POST[captcha] $_SESSION[captcha])而在为空时未进入该分支或使用了if (!empty($_POST[captcha]) ...)导致空值直接跳过校验或因为“兼容性设计”将空验证码视为自动通过即可实现绕过。根本原因是开发者没有强制验证码非空且必须匹配。✅ 今日学习效果自检清单我理解了验证码的正确工作流程生成、绑定会话、一次性、后端校验我在本地靶场搭建了存在验证码复用漏洞的登录页面我使用 BurpSuite 成功演示了固定验证码爆破密码的攻击我演示了通过置空验证码参数绕过验证码校验我知道验证码绕过通常与逻辑缺陷相关而非图像识别我意识到验证码必须与账户锁定、请求频率限制等机制联合使用才能有效防爆破⚠️ 阶段避坑重点实验范围严格控制验证码绕过技术仅用于授权测试和本地靶场。对于真实目标未经授权的验证码绕过和暴力破解均属违法行为。不要混淆验证码复用与识别今天的重点不是用 OCR 破解验证码而是利用逻辑缺陷。真实渗透中若验证码设计完善绕过难度会急剧上升。Session 销毁要彻底开发中应在验证码使用后无论成功或失败立即unset并刷新。同时登录失败后应强制更换验证码。不要忽视空值检测后端对所有输入参数必须进行严格非空和类型校验验证码为空直接拒绝绝不能跳过逻辑。验证码刷新要生成新值每次用户点击刷新或登录失败后验证码必须变更并同步更新到 Session。今天你学会了如何用逻辑而非算力攻克验证码防线。明天我们将继续深入学习暴力破解的深度防御包括账户锁定机制、登录失败延迟、IP 限制等综合防护体系并尝试在你的靶场上进行模拟对抗。请保留今天的实验代码明天可能用来加固。