Insecure CAPTCHA 不安全验证码:全等级绕过与 Burp 逻辑重放实操

📅 2026/7/18 16:47:15
Insecure CAPTCHA 不安全验证码:全等级绕过与 Burp 逻辑重放实操
Insecure CAPTCHA 不安全验证码全等级绕过与 Burp 逻辑重放实操前言1. 不安全验证码漏洞核心理论基础1.1 什么是 CAPTCHA 验证码1.2 不安全验证码漏洞本质1.3 验证码漏洞的常见类型1.4 漏洞危害1.5 DVWA Insecure CAPTCHA 模块说明2. DVWA Insecure CAPTCHA 模块Low2.1 首先抓请求包2.2 将数据包发送到Repeater2.3 源码分析2.3.1 整体逻辑拆分2.3.2 step1 分支完整流程2.3.3 step2 分支完整流程3. DVWA Insecure CAPTCHA 模块Medium3.1 使用Low级别的攻击方案尝试3.2 源码分析3.3 攻击实现3.4 攻击总结4. DVWA Insecure CAPTCHA 模块High4.1 纯黑盒测试的巨大难点4.2 High 级别源码完整分析4.2.1 整体逻辑改动4.2.2 验证码校验核心判断漏洞关键4.3 完整攻击利用步骤4.4 攻击总结5. DVWA Insecure CAPTCHA 模块Impossible5.1 安全等级说明5.2 多层安全防护源码分析5.2.1 CSRF 令牌校验前置拦截5.2.2 输入数据多层过滤与转义5.2.3 验证码校验逻辑无后门、无绕过通道5.2.4 原始密码校验身份二次鉴权5.2.5 数据库更新逻辑5.3 完整防护逻辑流程5.4 四级安全层级完整对比免责声明前言在上一篇文章中我们完整完成了 DVWA Brute Force 暴力破解模块全难度实操熟练掌握了 Burp Suite 抓包、请求重放、Intruder 爆破模块的基础与进阶用法理解了无防护登录接口存在的账号爆破风险。正常场景下网站会引入验证码机制抵御暴力猜解阻挡批量重复请求。但很多开发者仅简单实现验证码校验逻辑存在严重缺陷只做前端校验、后端未核验验证码有效性、会话未销毁旧验证码等导致验证码防护形同虚设。本文承接前文 Burp 操作基础针对 DVWA Insecure CAPTCHA 不安全验证码模块逐层审计 Low/Medium/High 三级源码演示不同层级验证码绕过思路区分前端校验漏洞与会话复用逻辑漏洞对比 Impossible 安全防护方案帮你吃透验证码类 Web 逻辑漏洞的挖掘与修复思路。 免责声明本文仅用于网络安全学习与教学演示所有实验均在本地搭建的授权靶场中进行。请勿将文中技术用于任何未授权的系统测试违者自行承担相应法律责任。1. 不安全验证码漏洞核心理论基础1.1 什么是 CAPTCHA 验证码CAPTCHA全自动区分计算机和人类的图灵测试的设计初衷是区分操作发起者是真人还是自动化脚本防止机器人批量注册、暴力破解、刷票、爬虫等恶意行为。常见形式图形字符验证码、滑动拼图验证码、短信/邮箱验证码、Google reCAPTCHA、极验行为验证码等。1.2 不安全验证码漏洞本质验证码的安全核心在于校验逻辑必须和业务操作强绑定且校验结果不可被客户端篡改。如果开发者把验证码校验拆成多步、把校验结果放在客户端可控的参数里、或者校验通过后没有和后续业务操作强绑定就会出现不安全验证码漏洞——攻击者可以绕过验证码校验直接执行敏感操作。一句话总结验证码形同虚设自动化脚本可以直接绕过防护完全失效。1.3 验证码漏洞的常见类型漏洞类型原理说明客户端校验绕过验证码只在前端JS校验后端不校验直接抓包跳过前端即可绕过校验结果可控验证码是否通过由客户端参数控制如step参数、passed_captcha标志位篡改参数直接绕过验证码复用同一个验证码可以反复使用不失效、不刷新抓一次包用无限次验证码可预测验证码生成算法有规律可被预测或枚举爆破多步校验逻辑缺陷验证码校验和业务操作拆成两步第一步过验证码第二步直接改参数跳业务逻辑验证码可识别图形验证码过于简单可被OCR工具/机器学习模型自动识别1.4 漏洞危害暴力破解账号密码不受验证码限制无限次尝试登录密码批量注册垃圾账号机器人批量注册用于刷量、发广告、薅羊毛短信/邮件轰炸无限次发送验证码消耗服务商资源骚扰用户刷票刷量自动化脚本批量投票、刷评论、刷积分、刷关注直接执行敏感操作绕过验证码直接改密、转账、删除数据等高危操作1.5 DVWA Insecure CAPTCHA 模块说明DVWA 的 Insecure CAPTCHA 模块以「修改密码」业务场景为载体模拟了 Google reCAPTCHA 验证码的多步校验逻辑。四个安全等级分别演示了不同程度的验证码设计缺陷Low客户端参数完全可控直接修改 step 参数绕过Medium校验逻辑存在缺陷可被伪造绕过High校验和业务绑定不严谨存在可利用的绕过通道Impossible完整正确的验证码校验逻辑无绕过空间接下来从 Low 级别开始逐级抓包复现、源码审计完整拆解验证码漏洞的利用与防御。2. DVWA Insecure CAPTCHA 模块Low2.1 首先抓请求包开启 Burp Suite 拦截功能页面输入新密码与确认密码示例123点击Change提交表单捕获 POST 原始请求。观察请求参数可发现隐藏控制参数step1该参数用于区分业务流程阶段。渗透测试通用测试思路页面出现step、stage这类分段流程参数时直接修改参数数值遍历测试step0无对应业务逻辑页面重置step1进入验证码校验流程强制校验人机验证step2直接执行密码修改逻辑不存在验证码校验环节。2.2 将数据包发送到Repeater将捕获的原始请求发送至 Repeater 模块修改请求参数把step1替换为step2其余密码参数保持不变。可以看到这里已经成功了回到Proxy将step改成2然后点击Forward将数据包发送过去此时可以看见密码修改成功2.3 源码分析此处我们贴出源码Unknown Vulnerability Source vulnerabilities/captcha/source/low.php?phpif(isset($_POST[Change])($_POST[step]1)){// Hide the CAPTCHA form$hide_formtrue;// Get input$pass_new$_POST[password_new];$pass_conf$_POST[password_conf];// Check CAPTCHA from 3rd party$resprecaptcha_check_answer($_DVWA[recaptcha_private_key],$_POST[g-recaptcha-response]);// Did the CAPTCHA fail?if(!$resp){// What happens when the CAPTCHA was entered incorrectly$html.prebr /The CAPTCHA was incorrect. Please try again./pre;$hide_formfalse;return;}else{// CAPTCHA was correct. Do both new passwords match?if($pass_new$pass_conf){// Show next stage for the userecho prebr /You passed the CAPTCHA! Click the button to confirm your changes.br //pre form action\#\ method\POST\ input type\hidden\ name\step\ value\2\ / input type\hidden\ name\password_new\ value\{$pass_new}\ / input type\hidden\ name\password_conf\ value\{$pass_conf}\ / input type\submit\ name\Change\ value\Change\ / /form;}else{// Both new passwords do not match.$html.preBoth passwords must match./pre;$hide_formfalse;}}}if(isset($_POST[Change])($_POST[step]2)){// Hide the CAPTCHA form$hide_formtrue;// Get input$pass_new$_POST[password_new];$pass_conf$_POST[password_conf];// Check to see if both password matchif($pass_new$pass_conf){// They do!$pass_new((isset($GLOBALS[___mysqli_ston])is_object($GLOBALS[___mysqli_ston]))?mysqli_real_escape_string($GLOBALS[___mysqli_ston],$pass_new):((trigger_error([MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.,E_USER_ERROR))?:));$pass_newmd5($pass_new);// Update database$insertUPDATE users SET password $pass_new WHERE user .dvwaCurrentUser().;;$resultmysqli_query($GLOBALS[___mysqli_ston],$insert)ordie(pre.((is_object($GLOBALS[___mysqli_ston]))?mysqli_error($GLOBALS[___mysqli_ston]):(($___mysqli_resmysqli_connect_error())?$___mysqli_res:false))./pre);// Feedback for the end userechoprePassword Changed./pre;}else{// Issue with the passwords matchingechoprePasswords did not match./pre;$hide_formfalse;}((is_null($___mysqli_resmysqli_close($GLOBALS[___mysqli_ston])))?false:$___mysqli_res);}?2.3.1 整体逻辑拆分代码分为两个独立互不依赖的if判断分支依靠客户端传入的step参数区分业务流程step 1验证码校验阶段step 2密码修改阶段两段代码是并列关系不存在先后锁死、会话标记校验服务端完全不记录用户是否完成验证码验证仅靠前端传参决定走哪段逻辑这是漏洞根源。2.3.2 step1 分支完整流程接收password_new、password_conf、谷歌验证码返回值g-recaptcha-response调用第三方谷歌接口校验验证码合法性验证码校验失败直接输出验证码错误提示返回页面终止流程验证码校验成功且两次新密码一致页面输出一段隐藏表单表单内置step2、新旧密码提供按钮提交进入下一阶段验证码正确但两次密码不一致返回密码不匹配提示停留在验证码页面。关键点只有正常通过验证码校验页面才会生成携带step2的表单正常访问谷歌的环境下能抓到step2请求国内网络无法连通谷歌验证接口验证码校验直接失败永远不会渲染该表单。2.3.3 step2 分支完整流程该分支无任何验证码相关校验代码执行逻辑接收前端传入的password_new、password_conf仅判断两次输入的新密码是否相同密码一致对密码做转义 MD5 加密执行 SQL 更新语句修改当前登录用户数据库密码输出Password Changed.密码不一致返回密码不匹配提示。致命缺陷程序没有设置 Session 标记记录 “用户已完成验证码校验”攻击者可直接构造step2的 POST 请求跳过整个验证码校验流程直接执行改密操作。3. DVWA Insecure CAPTCHA 模块Medium3.1 使用Low级别的攻击方案尝试开启 Burp 拦截捕获原始提交数据包依旧尝试将step1修改为step2直接发包发现无法成功绕过。Low 级别的单纯修改流程参数的攻击手段失效必须结合源码审计寻找新增校验逻辑。3.2 源码分析对比 Low 源码Medium 在step2分支新增了客户端参数校验逻辑服务端会读取 POST 参数passed_captcha仅当该参数值为true时才允许执行密码更新操作。正常流程中验证码校验通过后页面才会自动生成携带passed_captchatrue的隐藏表单若手动构造step2请求却缺少该参数后端会直接拦截改密操作。3.3 攻击实现将原始请求发送至 Burp Repeater修改核心参数step1→step2在请求末尾追加校验标识参数passed_captchatrue3. 完整 Payloadstep2password_new1111password_conf1111ChangeChangepassed_captchatrue。发送构造完成的请求页面返回Password Changed.漏洞利用成功3.4 攻击总结漏洞成因服务端仅校验前端传入的passed_captcha参数未使用 Session 在服务端存储验证码校验状态校验标记完全由客户端可控攻击者可手动添加该参数伪造 “已完成验证码验证” 的状态分段流程参数step依旧无服务端状态锁仅增加一层前端参数校验防护存在缺陷。4. DVWA Insecure CAPTCHA 模块High4.1 纯黑盒测试的巨大难点Low、Medium 两种经典绕过手段全部失效仅修改step2发包本层级代码已完全移除 step 分段逻辑不存在两段独立业务分支该方法彻底无效追加passed_captchatrue参数代码中无任何该参数的校验逻辑添加后无任何作用随意篡改、删除验证码参数后端直接判定验证码错误拦截改密操作。隐藏后门校验条件无任何前端线索漏洞核心是后端内置了一组特殊的绕过判定该逻辑完全写在服务端代码内页面、请求、响应均无任何提示纯黑盒依靠抓包试错几乎不可能猜到。4.2 High 级别源码完整分析4.2.1 整体逻辑改动与 Low/Medium 最大区别取消 step 分段流程所有操作合并为单段代码不再分两次提交表单统一在一次请求内完成验证码校验 密码修改。4.2.2 验证码校验核心判断漏洞关键if($resp||($_POST[g-recaptcha-response]hidd3n_valu3$_SERVER[HTTP_USER_AGENT]reCAPTCHA)){// 校验通过执行改密码逻辑}校验逻辑为「或」关系满足任意一个条件即可放行正常条件$resp谷歌验证码接口返回验证成功隐藏后门条件POST 参数g-recaptcha-response值固定为hidd3n_valu3请求头User-Agent固定为reCAPTCHA只要同时满足以上两个头部 参数条件后端直接判定验证码合法无需真实人机验证。4.3 完整攻击利用步骤抓取原始提交数据包原始请求携带正常表单参数修改两处关键内容POST 参数新增 / 修改g-recaptcha-responsehidd3n_valu3请求头User-Agent修改为reCAPTCHA完整请求参数示例step2password_new1111password_conf1111user_token65189ca59a58a9b887f22fd50ce84a0bChangeChangeg-recaptcha-responsehidd3n_valu3发送构造后的请求页面返回Password Changed.绕过验证码成功。4.4 攻击总结漏洞成因开发者在后端内置硬编码后门预留固定参数 请求头组合绕过验证码校验后门判断使用逻辑或||与正常验证码校验并列无需真实人机验证即可放行后门条件无任何前端提示黑盒测试极难发现仅源码审计可快速定位。5. DVWA Insecure CAPTCHA 模块Impossible此处我们贴出源码?phpif(isset($_POST[Change])){// Check Anti-CSRF tokencheckToken($_REQUEST[user_token],$_SESSION[session_token],index.php);// Hide the CAPTCHA form$hide_formtrue;// Get input$pass_new$_POST[password_new];$pass_newstripslashes($pass_new);$pass_new((isset($GLOBALS[___mysqli_ston])is_object($GLOBALS[___mysqli_ston]))?mysqli_real_escape_string($GLOBALS[___mysqli_ston],$pass_new):((trigger_error([MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.,E_USER_ERROR))?:));$pass_newmd5($pass_new);$pass_conf$_POST[password_conf];$pass_confstripslashes($pass_conf);$pass_conf((isset($GLOBALS[___mysqli_ston])is_object($GLOBALS[___mysqli_ston]))?mysqli_real_escape_string($GLOBALS[___mysqli_ston],$pass_conf):((trigger_error([MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.,E_USER_ERROR))?:));$pass_confmd5($pass_conf);$pass_curr$_POST[password_current];$pass_currstripslashes($pass_curr);$pass_curr((isset($GLOBALS[___mysqli_ston])is_object($GLOBALS[___mysqli_ston]))?mysqli_real_escape_string($GLOBALS[___mysqli_ston],$pass_curr):((trigger_error([MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.,E_USER_ERROR))?:));$pass_currmd5($pass_curr);// Check CAPTCHA from 3rd party$resprecaptcha_check_answer($_DVWA[recaptcha_private_key],$_POST[g-recaptcha-response]);// Did the CAPTCHA fail?if(!$resp){// What happens when the CAPTCHA was entered incorrectlyechoprebr /The CAPTCHA was incorrect. Please try again./pre;$hide_formfalse;}else{// Check that the current password is correct$data$db-prepare(SELECT password FROM users WHERE user (:user) AND password (:password) LIMIT 1;);$data-bindParam(:user,dvwaCurrentUser(),PDO::PARAM_STR);$data-bindParam(:password,$pass_curr,PDO::PARAM_STR);$data-execute();// Do both new password match and was the current password correct?if(($pass_new$pass_conf)($data-rowCount()1)){// Update the database$data$db-prepare(UPDATE users SET password (:password) WHERE user (:user););$data-bindParam(:password,$pass_new,PDO::PARAM_STR);$data-bindParam(:user,dvwaCurrentUser(),PDO::PARAM_STR);$data-execute();// Feedback for the end user - success!echoprePassword Changed./pre;}else{// Feedback for the end user - failed!echopreEither your current password is incorrect or the new passwords did not match.br /Please try again./pre;$hide_formfalse;}}}// Generate Anti-CSRF tokengenerateSessionToken();?5.1 安全等级说明Impossible 为最高安全防护层级整合多层防护机制不存在可绕过验证码的漏洞无法通过篡改参数、修改请求头、复用会话等方式绕过校验。纯黑盒测试无任何可利用入口直接结合源码分层拆解安全防护逻辑。5.2 多层安全防护源码分析5.2.1 CSRF 令牌校验前置拦截checkToken( $_REQUEST[ user_token ], $_SESSION[ session_token ], index.php );每次提交表单必须携带服务端会话生成的一次性user_tokenToken 存储在服务端 Session每次页面刷新会重新生成无 Token、Token 篡改、Token 过期均会直接拦截请求杜绝批量重放、跨站伪造请求攻击。5.2.2 输入数据多层过滤与转义对当前密码、新密码、确认密码统一做安全处理stripslashes()清除输入中的转义反斜杠mysqli_real_escape_string()特殊字符数据库转义防SQL注入md5()密码统一哈希加密不存储明文所有用户可控输入均做净化避免注入类漏洞。5.2.3 验证码校验逻辑无后门、无绕过通道$resprecaptcha_check_answer($_DVWA[recaptcha_private_key],$_POST[g-recaptcha-response]);if(!$resp){echoprebr /The CAPTCHA was incorrect. Please try again./pre;$hide_formfalse;}仅保留唯一合法校验通道必须调用谷歌 reCAPTCHA 第三方接口验证人机结果移除了High级别的硬编码后门不存在自定义参数、UA伪造绕过的逻辑分支。验证码校验失败直接终止业务流程。5.2.4 原始密码校验身份二次鉴权$data $db-prepare( SELECT password FROM users WHERE user (:user) AND password (:password) LIMIT 1; );采用PDO预编译SQL语句参数绑定彻底杜绝SQL注入修改密码前强制校验当前登录账号的旧密码仅当旧密码哈希匹配数据库记录时才允许执行改密操作双重条件放行新密码一致 旧密码正确任意一项不满足直接返回失败提示。5.2.5 数据库更新逻辑同样使用PDO预编译语句执行UPDATE更新全程参数绑定无字符串拼接漏洞数据库操作安全可控。5.3 完整防护逻辑流程接收POST请求 → 校验一次性CSRF Token非法Token直接拦截清洗、加密全部密码输入参数调用谷歌接口校验验证码验证码错误直接返回页面验证码合法后查询数据库校验用户输入的旧密码是否匹配同时满足「新旧两次密码一致」「旧密码校验通过」两个条件才执行密码更新页面刷新生成全新Session Token销毁旧令牌。5.4 四级安全层级完整对比等级核心漏洞绕过方式防护短板Low分段step完全可控无验证码校验抓包修改step2无任何服务端校验逻辑Mediumstep分段前端参数标记校验step2 passed_captchatrue校验凭证存于客户端可伪造High内置硬编码后门绕过验证码UA:reCAPTCHA g-recaptcha-responsehidd3n_valu3后端预留明文后门判断Impossible无可用漏洞不存在有效绕过手段多层安全机制闭环防护免责声明本文所有内容仅用于网络安全技术研究与教学演示所有测试均在本地授权搭建的 DVWA 靶场环境中进行旨在帮助读者理解漏洞原理与防御机制。请勿将本文涉及的技术与方法用于任何未经授权的真实系统测试。任何利用本文内容进行的非法攻击行为均与作者无关由使用者自行承担相应法律责任。网络安全学习请严格遵守《中华人民共和国网络安全法》及相关法律法规仅在获得明确书面授权的前提下开展安全测试。