1. 项目概述当验证码遇上自动化测试在Web应用安全测试特别是渗透测试的授权攻击阶段验证码CAPTCHA常常是横亘在自动化攻击工具面前的一道“叹息之墙”。它的设计初衷就是为了区分人类用户和自动化脚本防止暴力破解Brute-Force、撞库等攻击。然而在安全评估的实战中我们经常需要测试目标系统在验证码防护下的实际强度。这时一个强大的工具链和清晰的思路就显得至关重要。今天要聊的就是如何利用渗透测试领域的“瑞士军刀”——Burp Suite来尝试突破这道防线实现验证码场景下的暴力破解测试。这绝不是鼓励攻击而是在授权测试的框架内理解攻击者的思路从而帮助开发者和安全工程师构建更健壮的防御体系。整个过程涉及对HTTP/S请求流的精细操控、会话Session管理、以及可能用到的验证码识别技术。我们将从最基础的手工测试思路讲起逐步深入到半自动化乃至高度自动化的方案并重点剖析每一步背后的原理和可能遇到的“坑”。无论你是刚接触Burp的新手还是想深化对自动化测试理解的老兵相信都能从中找到有价值的参考。2. 核心思路与方案选型绕过而非破解在开始动手之前我们必须明确一个核心理念对于验证码我们的目标通常不是去“破解”或“识别”它除非验证码本身极其脆弱而是寻找逻辑或实现上的缺陷来“绕过”它。基于这个思路我们可以梳理出几种主流的测试方案。2.1 方案一验证码一次性有效与重复使用这是最常见也最应该优先测试的漏洞。其原理是服务器端未能正确校验验证码的一次性One-Time特性。测试方法在Burp中先捕获一个包含正确验证码的合法登录请求。然后在Intruder或Repeater模块中反复重放这个请求仅修改密码字段观察服务器响应。为什么有效如果服务器只检查验证码文本是否正确而不检查该验证码是否已被使用过或与当前会话绑定那么攻击者就可以用一个正确的验证码尝试无数个密码。实操要点使用Burp Repeater进行快速手动测试是第一步。如果确认存在此漏洞再使用Intruder进行自动化爆破。2.2 方案二验证码与会话Session绑定失效验证码必须与用户会话通常通过Cookie或Token标识强关联。如果关联失效就会出现严重问题。场景A验证码可跨会话使用在浏览器A获取验证码后能在浏览器B不同会话中使用该验证码成功提交。这通常意味着验证码存储在全局缓存或数据库中仅通过文本匹配未校验会话ID。场景B验证码在会话内可预测有些系统使用弱随机算法生成验证码或者验证码是顺序生成的。攻击者可以在自己的会话中获取多个验证码寻找规律。测试方法需要同时操作两个Burp或两个浏览器实例或者使用脚本管理多个会话。对比不同会话中验证码的生成规律和可用性。2.3 方案三验证码识别OCR与打码平台接入当上述逻辑漏洞不存在时我们才需要考虑正面“识别”验证码。这属于资源消耗型攻击。本地OCR识别适用于简单的数字、字母扭曲验证码。可以使用Python的Tesseract库但成功率高度依赖验证码复杂度。需要在Burp扩展中集成识别逻辑。第三方打码平台将Burp截获的验证码图片请求转发到专业的打码平台如超级鹰、联众等由人工或高精度AI识别后返回结果再填入爆破载荷中。这是目前成功率最高的自动化方案但会产生费用。选择考量本地OCR免费但识别率不稳定适合测试或简单验证码。打码平台成本低通常几分钱一次、识别率高适合正式的渗透测试项目。关键点在于识别过程必须无缝集成到Burp的爆破流程中这通常需要通过编写自定义的Burp扩展如利用Montoya API或Extender API来实现。2.4 方案四前端绕过与响应篡改这是一种“取巧”的方法关注点从服务器转移到了客户端。前端校验绕过有些验证码的校验逻辑仅在前端JavaScript中完成提交到服务器的请求中可能根本不包含验证码字段或者包含一个固定的“已通过”标记。通过Burp拦截并修改请求可以轻易绕过。响应包篡改更隐蔽的一种情况是服务器会在响应包中返回一个标记如”captcha_valid”: true前端根据这个标记决定是否提交表单。如果攻击者能拦截并修改这个响应包例如使用Burp的Match and Replace规则或扩展就能欺骗前端跳过验证码检查。测试方法仔细分析登录流程的每一个HTTP请求和响应使用Burp的Proxy - HTTP history功能追踪所有交互寻找可以被操控的薄弱点。注意所有测试必须在获得明确书面授权的范围内进行。未经授权对任何系统实施暴力破解或绕过验证码是违法行为。3. 环境准备与Burp配置工欲善其事必先利其器。在开始复杂的爆破之前我们需要一个可控的测试环境和正确配置的Burp Suite。3.1 搭建测试靶场为了安全、合法地演示我们强烈建议在本地或隔离网络搭建一个含有验证码功能的测试靶场。DVWA (Damn Vulnerable Web Application)集成在Kali Linux中或可单独部署其“Brute Force”模块就包含一个简单的验证码后期版本。这是入门首选。bWAPP另一个优秀的漏洞练习平台包含多种验证码相关的漏洞场景。自定义PHP/Flask应用如果你有开发能力可以快速写一个带验证码的登录页面并故意留下“验证码重复使用”的漏洞用于练习。这里以DVWA为例确保其运行在http://localhost/dvwa并以默认凭证 (admin/password) 登录将安全级别设置为Low或Medium以便进行测试。3.2 Burp Suite代理与浏览器配置这是抓包和分析的基础。启动Burp Proxy打开Burp确保Proxy - Intercept是Intercept is on状态。默认监听127.0.0.1:8080。浏览器配置代理以Firefox为例推荐用于测试因其代理配置独立于系统。打开设置 - 网络设置 - 手动代理配置。HTTP代理127.0.0.1端口8080。勾选“同时将此代理用于 HTTPS”。安装Burp CA证书为了解密HTTPS流量必须在浏览器中安装Burp的CA证书。在浏览器中访问http://burp或http://127.0.0.1:8080。点击CA Certificate链接下载证书文件。在Firefox的设置 - 隐私与安全 - 证书 - 查看证书 - 证书机构 - 导入选择下载的文件勾选“信任此CA标识网站”。验证抓包配置完成后在浏览器中访问DVWA靶场查看Burp的Proxy - HTTP history应该能看到所有HTTP/HTTPS请求记录。3.3 关键模块熟悉Proxy, Intruder, RepeaterProxy (代理)所有流量的出入口用于拦截、查看、修改请求/响应。Repeater (重放器)用于手动地、多次重放一个请求并观察响应变化。它是测试验证码是否可重用的利器。Intruder (入侵者)自动化攻击模块用于进行暴力破解、模糊测试等。我们将主要用它来实施爆破。Session (会话)管理会话令牌、Cookie的工具在维持登录状态或处理会话绑定的验证码时至关重要。4. 手工测试验证码重用漏洞挖掘让我们从最简单的漏洞开始使用Repeater进行手工验证。4.1 捕获含验证码的登录请求在DVWA中进入Brute Force页面。在浏览器中输入用户名如admin、错误的密码如test和页面显示的验证码。点击Login此时请求会被Burp拦截。在Burp的Proxy - Intercept标签页你可以看到被拦截的POST请求。将它发送到Repeater快捷键CtrlR或右键菜单。4.2 使用Repeater测试验证码重用现在你在Repeater标签页有了这个请求。首次发送直接点击Send观察右侧的响应。通常会返回登录失败的信息如Username and/or password incorrect.。同时注意响应里可能包含了新的验证码图片一个img src”captcha.php?…标签。这说明服务器在每次失败后更新了验证码。关键测试不要刷新浏览器页面。在Repeater中保持请求体内的验证码字段如user_token或captcha完全不变只修改password字段为另一个猜测的密码如123456。再次发送点击Send。此时你需要密切关注响应内容如果响应依然是密码错误这很正常我们还没试到正确密码。如果响应变成了Login successful或其他成功标识恭喜你发现了验证码重用漏洞服务器接受了旧的验证码。如果响应提示“验证码错误”或要求刷新页面说明服务器正确校验了验证码的一次性这个漏洞不存在。这个手工过程虽然简单但却是理解漏洞本质的关键。它清晰地展示了一个未失效的验证码就像一把可以打开门锁多次的钥匙。5. 自动化爆破Intruder模块深度配置当手工测试确认存在漏洞或你想用识别技术攻击无漏洞的验证码时就需要用到Intruder进行自动化爆破。5.1 载荷Payload定位与类型选择将拦截到的登录请求发送到Intruder快捷键CtrlI。清除默认标记进入Positions标签点击Clear §按钮清空所有Burp自动添加的攻击标记§。标记变量位置我们通常需要爆破两个变量password和captcha或user_token。选中密码字段的值如test点击Add §将其标记为password_payload。对于验证码字段情况复杂如果验证码可重用则不要标记它。保持它为第一次捕获的正确值。如果验证码需要识别则需要标记它并为它配置一个从识别引擎获取的动态载荷。如果验证码是CSRF Token如DVWA的user_token它通常每次请求都变且与会话绑定。这时需要用到Pitchfork或Cluster bomb攻击类型并配合Extract功能获取新的Token。我们稍后详述。攻击类型选择Sniper对单个位置使用一组载荷。适合只爆破密码。Battering ram对多个位置使用同一组载荷。不常用。Pitchfork最常用。为每个标记位置配置独立的载荷集并同步迭代。例如位置1用密码字典位置2用实时获取的验证码列表。它要求两个载荷集数量相同。Cluster bomb最强大。为每个标记位置配置独立的载荷集并进行笛卡尔积组合。例如10个密码和100个验证码会尝试1000次。资源消耗大但覆盖全。5.2 配置载荷集Payload Sets在Payloads标签页你可以为每个标记的位置Payload set配置数据。密码载荷集Set 1Payload type选择Simple list。在下方列表中粘贴你的密码字典或使用Burp内置的Runtime file功能加载一个字典文件。验证码载荷集Set 2 - 如果需要这是难点。如果验证码需要实时识别Simple list无效。你需要Payload type选择Extension-generated。这允许你调用自定义的Burp扩展来动态生成每个验证码。你需要提前编写或加载一个能够完成“获取验证码图片 - 识别 - 返回文本”的扩展。更实用的半自动方法对于非大规模测试可以先用脚本或手动收集一批验证码和其正确值保存成文件然后使用Runtime file或Custom iterator来加载。但这要求验证码在短时间内有效。5.3 处理会话与动态Token以DVWA为例DVWA的Brute Force模块在Low级别下使用一个名为user_token的参数来防止CSRF它同时也是变相的验证码。每次请求页面都会变化。我们需要在爆破过程中自动获取它。配置攻击类型使用Pitchfork。标记两个位置password和user_token。配置密码载荷Set 1为Simple list字典。配置Token载荷这是关键。在Payloads标签选择Payload set: 2。Payload type选择Recursive grep。点击Options子标签找到Recursive grep区域。点击Add打开定义提取规则的对话框。设置提取规则首先你需要一个初始请求来获取第一个Token。回到Proxy - HTTP history找到提交登录前浏览器GET请求brute.php页面的那个请求。把它发送到Intruder。在Intruder的Positions标签你会看到这个GET请求。在响应Response部分找到user_token的隐藏输入框值例如value”a1b2c3d4e5f6″。选中这个Token值仅值不包括引号在Payloads标签的Recursive grep选项里点击AddBurp会自动生成一个提取规则如name’user_token’ value’(.*?)’。这个规则会从每个请求的响应中提取新的Token。重要在Options标签的Request Headers部分确保勾选了Update Content-Length header。运行与原理Intruder会先发送初始GET请求提取Token1然后将其与密码字典中的第一个密码组合发送POST请求。接着它会从POST请求的响应通常是登录失败页面其中包含了新的Token中提取Token2再与密码字典中的第二个密码组合如此循环。这就实现了Token的自动更新。5.4 设置资源池与速率限制在Resource pool选项卡可以创建资源池限制并发线程数和请求间隔。这对于避免触发目标系统的WAFWeb应用防火墙或速率限制警报至关重要。线程数Number of threads建议从1-5开始低调测试。请求间隔Throttle可以设置每个请求之间固定延迟如1000毫秒或随机延迟范围。6. 高级技巧验证码识别集成与扩展开发对于无法绕过的复杂验证码集成识别能力是终极方案。这通常需要开发Burp扩展。6.1 使用现有扩展Captcha Killer 与 Turbo IntruderBurp Suite 202x 的Burp BApp Store中可能有一些验证码识别相关的扩展但稳定性和通用性参差不齐。需要仔细甄别。Turbo Intruder一个高性能的爆破扩展支持Python脚本。你可以在脚本中编写逻辑在每次请求前先发起一个获取验证码图片的请求调用OCR函数或打码平台API进行识别然后将识别结果填入主请求的载荷中。这需要较强的脚本能力。6.2 自定义扩展开发思路基于Montoya API对于专业的渗透测试团队开发一个自定义扩展是值得的。核心流程如下实现IIntruderPayloadGenerator接口这个接口负责在Intruder攻击中生成动态载荷。在生成器中 a.getNextPayload()方法被调用时首先向目标验证码图片URL如/captcha.php发起一个HTTP请求。 b. 将返回的图片字节流通过HTTP POST发送到你配置的打码平台API。 c. 解析打码平台返回的JSON提取识别出的文本。 d. 将这个文本作为本次的Payload返回。处理会话确保获取验证码和提交登录的请求使用同一个会话Cookie这通常需要扩展同时实现IHttpListener来管理会话状态。错误处理加入重试、识别失败处理等逻辑。实操心得与打码平台集成时务必购买足够的题分并进行充分的测试调用确保API稳定。在扩展中加入缓存机制对同一会话短期内相同的验证码图片URL直接返回缓存结果可以节省成本和时间。7. 常见问题、排查技巧与防御建议7.1 爆破过程中常见问题问题现象可能原因排查思路所有请求返回相同错误如“验证码错误”1. 验证码不可重用且未正确更新。2. 会话丢失导致验证码与请求不匹配。3. 请求头如Content-Type不正确。1. 在Project options - Sessions中配置会话处理规则确保Cookie被正确携带。2. 使用Logger等扩展查看每个请求的完整内容对比与浏览器手动发送的请求差异。3. 检查验证码字段名是否正确是否有多余或缺失的参数。请求几次后连接被重置或IP被封触发了目标的速率限制或WAF规则。1. 在Intruder的Resource pool中大幅降低线程数增加请求延迟如3-5秒。2. 使用代理池轮换源IP需配置Burp上游代理。3. 尝试在非高峰时段测试。Intruder显示成功但响应体是错误页面可能成功跳转到了登录后的页面但Intruder的检测器Grep – Match设置不当。1. 在Intruder的Options - Grep – Match中添加一个标志成功的关键词如Welcome, admin或Logout。2. 更可靠的方法是检查响应长度Length成功页面的长度通常与错误页面显著不同。Recursive grep提取Token失败1. 提取规则写得不准确。2. 响应结构发生变化如登录失败后跳转到不同页面。1. 使用ExtractorBurp自带的提取工具调试提取规则确保它能从响应中准确抓取到值。2. 在Options - Grep – Extract中添加多个备选规则或使用更宽泛的正则表达式。7.2 给开发者的防御建议作为测试的另一方面了解如何防御同样重要服务器端一次性校验验证码使用后立即在服务端会话中标记为失效无论验证对错。强会话绑定将验证码与生成它的会话ID强关联存储在服务端如Session或Redis杜绝跨会话使用。增加噪音与扭曲使用成熟的验证码库如Google reCAPTCHA v3 极验行为验证增加机器识别的难度。但要注意用户体验。实施严格的速率限制不仅对登录失败次数也对验证码获取频率进行限制如每IP每分钟最多获取5次每天最多失败20次。验证码生命周期设置较短的过期时间如2分钟。前端校验仅为辅助所有安全相关的校验必须在服务端最终执行。永远不要信任客户端传来的任何状态标识。7.3 个人实操体会在实际的授权测试中完全依赖自动化爆破验证码登录的情况并不多。更多的时候验证码的存在会促使测试者去挖掘其他漏洞比如密码重置逻辑缺陷、短信轰炸、会话固定等。Burp Suite在这其中的价值在于它提供了一个高度可定制和可视化的平台让你能够将各种想法如会话处理、载荷生成、响应提取快速组合成一条攻击链。我个人的经验是面对验证码首先花30分钟进行彻底的手工逻辑测试重用、绑定、前端绕过这往往比直接上自动化工具更有效率。如果逻辑上无懈可击再评估识别成本与测试收益。很多时候绕过验证码的“漏洞”并不在验证码本身而在与之相关的业务逻辑深处。保持这种探索的心态才是用好Burp这类工具的关键。最后记得在测试报告里不仅要写出漏洞更要清晰地描述你的测试步骤和流量证据这样开发团队才能精准地修复它。
Burp Suite实战:验证码场景下的自动化渗透测试与绕过技术
发布时间:2026/6/30 1:09:57
1. 项目概述当验证码遇上自动化测试在Web应用安全测试特别是渗透测试的授权攻击阶段验证码CAPTCHA常常是横亘在自动化攻击工具面前的一道“叹息之墙”。它的设计初衷就是为了区分人类用户和自动化脚本防止暴力破解Brute-Force、撞库等攻击。然而在安全评估的实战中我们经常需要测试目标系统在验证码防护下的实际强度。这时一个强大的工具链和清晰的思路就显得至关重要。今天要聊的就是如何利用渗透测试领域的“瑞士军刀”——Burp Suite来尝试突破这道防线实现验证码场景下的暴力破解测试。这绝不是鼓励攻击而是在授权测试的框架内理解攻击者的思路从而帮助开发者和安全工程师构建更健壮的防御体系。整个过程涉及对HTTP/S请求流的精细操控、会话Session管理、以及可能用到的验证码识别技术。我们将从最基础的手工测试思路讲起逐步深入到半自动化乃至高度自动化的方案并重点剖析每一步背后的原理和可能遇到的“坑”。无论你是刚接触Burp的新手还是想深化对自动化测试理解的老兵相信都能从中找到有价值的参考。2. 核心思路与方案选型绕过而非破解在开始动手之前我们必须明确一个核心理念对于验证码我们的目标通常不是去“破解”或“识别”它除非验证码本身极其脆弱而是寻找逻辑或实现上的缺陷来“绕过”它。基于这个思路我们可以梳理出几种主流的测试方案。2.1 方案一验证码一次性有效与重复使用这是最常见也最应该优先测试的漏洞。其原理是服务器端未能正确校验验证码的一次性One-Time特性。测试方法在Burp中先捕获一个包含正确验证码的合法登录请求。然后在Intruder或Repeater模块中反复重放这个请求仅修改密码字段观察服务器响应。为什么有效如果服务器只检查验证码文本是否正确而不检查该验证码是否已被使用过或与当前会话绑定那么攻击者就可以用一个正确的验证码尝试无数个密码。实操要点使用Burp Repeater进行快速手动测试是第一步。如果确认存在此漏洞再使用Intruder进行自动化爆破。2.2 方案二验证码与会话Session绑定失效验证码必须与用户会话通常通过Cookie或Token标识强关联。如果关联失效就会出现严重问题。场景A验证码可跨会话使用在浏览器A获取验证码后能在浏览器B不同会话中使用该验证码成功提交。这通常意味着验证码存储在全局缓存或数据库中仅通过文本匹配未校验会话ID。场景B验证码在会话内可预测有些系统使用弱随机算法生成验证码或者验证码是顺序生成的。攻击者可以在自己的会话中获取多个验证码寻找规律。测试方法需要同时操作两个Burp或两个浏览器实例或者使用脚本管理多个会话。对比不同会话中验证码的生成规律和可用性。2.3 方案三验证码识别OCR与打码平台接入当上述逻辑漏洞不存在时我们才需要考虑正面“识别”验证码。这属于资源消耗型攻击。本地OCR识别适用于简单的数字、字母扭曲验证码。可以使用Python的Tesseract库但成功率高度依赖验证码复杂度。需要在Burp扩展中集成识别逻辑。第三方打码平台将Burp截获的验证码图片请求转发到专业的打码平台如超级鹰、联众等由人工或高精度AI识别后返回结果再填入爆破载荷中。这是目前成功率最高的自动化方案但会产生费用。选择考量本地OCR免费但识别率不稳定适合测试或简单验证码。打码平台成本低通常几分钱一次、识别率高适合正式的渗透测试项目。关键点在于识别过程必须无缝集成到Burp的爆破流程中这通常需要通过编写自定义的Burp扩展如利用Montoya API或Extender API来实现。2.4 方案四前端绕过与响应篡改这是一种“取巧”的方法关注点从服务器转移到了客户端。前端校验绕过有些验证码的校验逻辑仅在前端JavaScript中完成提交到服务器的请求中可能根本不包含验证码字段或者包含一个固定的“已通过”标记。通过Burp拦截并修改请求可以轻易绕过。响应包篡改更隐蔽的一种情况是服务器会在响应包中返回一个标记如”captcha_valid”: true前端根据这个标记决定是否提交表单。如果攻击者能拦截并修改这个响应包例如使用Burp的Match and Replace规则或扩展就能欺骗前端跳过验证码检查。测试方法仔细分析登录流程的每一个HTTP请求和响应使用Burp的Proxy - HTTP history功能追踪所有交互寻找可以被操控的薄弱点。注意所有测试必须在获得明确书面授权的范围内进行。未经授权对任何系统实施暴力破解或绕过验证码是违法行为。3. 环境准备与Burp配置工欲善其事必先利其器。在开始复杂的爆破之前我们需要一个可控的测试环境和正确配置的Burp Suite。3.1 搭建测试靶场为了安全、合法地演示我们强烈建议在本地或隔离网络搭建一个含有验证码功能的测试靶场。DVWA (Damn Vulnerable Web Application)集成在Kali Linux中或可单独部署其“Brute Force”模块就包含一个简单的验证码后期版本。这是入门首选。bWAPP另一个优秀的漏洞练习平台包含多种验证码相关的漏洞场景。自定义PHP/Flask应用如果你有开发能力可以快速写一个带验证码的登录页面并故意留下“验证码重复使用”的漏洞用于练习。这里以DVWA为例确保其运行在http://localhost/dvwa并以默认凭证 (admin/password) 登录将安全级别设置为Low或Medium以便进行测试。3.2 Burp Suite代理与浏览器配置这是抓包和分析的基础。启动Burp Proxy打开Burp确保Proxy - Intercept是Intercept is on状态。默认监听127.0.0.1:8080。浏览器配置代理以Firefox为例推荐用于测试因其代理配置独立于系统。打开设置 - 网络设置 - 手动代理配置。HTTP代理127.0.0.1端口8080。勾选“同时将此代理用于 HTTPS”。安装Burp CA证书为了解密HTTPS流量必须在浏览器中安装Burp的CA证书。在浏览器中访问http://burp或http://127.0.0.1:8080。点击CA Certificate链接下载证书文件。在Firefox的设置 - 隐私与安全 - 证书 - 查看证书 - 证书机构 - 导入选择下载的文件勾选“信任此CA标识网站”。验证抓包配置完成后在浏览器中访问DVWA靶场查看Burp的Proxy - HTTP history应该能看到所有HTTP/HTTPS请求记录。3.3 关键模块熟悉Proxy, Intruder, RepeaterProxy (代理)所有流量的出入口用于拦截、查看、修改请求/响应。Repeater (重放器)用于手动地、多次重放一个请求并观察响应变化。它是测试验证码是否可重用的利器。Intruder (入侵者)自动化攻击模块用于进行暴力破解、模糊测试等。我们将主要用它来实施爆破。Session (会话)管理会话令牌、Cookie的工具在维持登录状态或处理会话绑定的验证码时至关重要。4. 手工测试验证码重用漏洞挖掘让我们从最简单的漏洞开始使用Repeater进行手工验证。4.1 捕获含验证码的登录请求在DVWA中进入Brute Force页面。在浏览器中输入用户名如admin、错误的密码如test和页面显示的验证码。点击Login此时请求会被Burp拦截。在Burp的Proxy - Intercept标签页你可以看到被拦截的POST请求。将它发送到Repeater快捷键CtrlR或右键菜单。4.2 使用Repeater测试验证码重用现在你在Repeater标签页有了这个请求。首次发送直接点击Send观察右侧的响应。通常会返回登录失败的信息如Username and/or password incorrect.。同时注意响应里可能包含了新的验证码图片一个img src”captcha.php?…标签。这说明服务器在每次失败后更新了验证码。关键测试不要刷新浏览器页面。在Repeater中保持请求体内的验证码字段如user_token或captcha完全不变只修改password字段为另一个猜测的密码如123456。再次发送点击Send。此时你需要密切关注响应内容如果响应依然是密码错误这很正常我们还没试到正确密码。如果响应变成了Login successful或其他成功标识恭喜你发现了验证码重用漏洞服务器接受了旧的验证码。如果响应提示“验证码错误”或要求刷新页面说明服务器正确校验了验证码的一次性这个漏洞不存在。这个手工过程虽然简单但却是理解漏洞本质的关键。它清晰地展示了一个未失效的验证码就像一把可以打开门锁多次的钥匙。5. 自动化爆破Intruder模块深度配置当手工测试确认存在漏洞或你想用识别技术攻击无漏洞的验证码时就需要用到Intruder进行自动化爆破。5.1 载荷Payload定位与类型选择将拦截到的登录请求发送到Intruder快捷键CtrlI。清除默认标记进入Positions标签点击Clear §按钮清空所有Burp自动添加的攻击标记§。标记变量位置我们通常需要爆破两个变量password和captcha或user_token。选中密码字段的值如test点击Add §将其标记为password_payload。对于验证码字段情况复杂如果验证码可重用则不要标记它。保持它为第一次捕获的正确值。如果验证码需要识别则需要标记它并为它配置一个从识别引擎获取的动态载荷。如果验证码是CSRF Token如DVWA的user_token它通常每次请求都变且与会话绑定。这时需要用到Pitchfork或Cluster bomb攻击类型并配合Extract功能获取新的Token。我们稍后详述。攻击类型选择Sniper对单个位置使用一组载荷。适合只爆破密码。Battering ram对多个位置使用同一组载荷。不常用。Pitchfork最常用。为每个标记位置配置独立的载荷集并同步迭代。例如位置1用密码字典位置2用实时获取的验证码列表。它要求两个载荷集数量相同。Cluster bomb最强大。为每个标记位置配置独立的载荷集并进行笛卡尔积组合。例如10个密码和100个验证码会尝试1000次。资源消耗大但覆盖全。5.2 配置载荷集Payload Sets在Payloads标签页你可以为每个标记的位置Payload set配置数据。密码载荷集Set 1Payload type选择Simple list。在下方列表中粘贴你的密码字典或使用Burp内置的Runtime file功能加载一个字典文件。验证码载荷集Set 2 - 如果需要这是难点。如果验证码需要实时识别Simple list无效。你需要Payload type选择Extension-generated。这允许你调用自定义的Burp扩展来动态生成每个验证码。你需要提前编写或加载一个能够完成“获取验证码图片 - 识别 - 返回文本”的扩展。更实用的半自动方法对于非大规模测试可以先用脚本或手动收集一批验证码和其正确值保存成文件然后使用Runtime file或Custom iterator来加载。但这要求验证码在短时间内有效。5.3 处理会话与动态Token以DVWA为例DVWA的Brute Force模块在Low级别下使用一个名为user_token的参数来防止CSRF它同时也是变相的验证码。每次请求页面都会变化。我们需要在爆破过程中自动获取它。配置攻击类型使用Pitchfork。标记两个位置password和user_token。配置密码载荷Set 1为Simple list字典。配置Token载荷这是关键。在Payloads标签选择Payload set: 2。Payload type选择Recursive grep。点击Options子标签找到Recursive grep区域。点击Add打开定义提取规则的对话框。设置提取规则首先你需要一个初始请求来获取第一个Token。回到Proxy - HTTP history找到提交登录前浏览器GET请求brute.php页面的那个请求。把它发送到Intruder。在Intruder的Positions标签你会看到这个GET请求。在响应Response部分找到user_token的隐藏输入框值例如value”a1b2c3d4e5f6″。选中这个Token值仅值不包括引号在Payloads标签的Recursive grep选项里点击AddBurp会自动生成一个提取规则如name’user_token’ value’(.*?)’。这个规则会从每个请求的响应中提取新的Token。重要在Options标签的Request Headers部分确保勾选了Update Content-Length header。运行与原理Intruder会先发送初始GET请求提取Token1然后将其与密码字典中的第一个密码组合发送POST请求。接着它会从POST请求的响应通常是登录失败页面其中包含了新的Token中提取Token2再与密码字典中的第二个密码组合如此循环。这就实现了Token的自动更新。5.4 设置资源池与速率限制在Resource pool选项卡可以创建资源池限制并发线程数和请求间隔。这对于避免触发目标系统的WAFWeb应用防火墙或速率限制警报至关重要。线程数Number of threads建议从1-5开始低调测试。请求间隔Throttle可以设置每个请求之间固定延迟如1000毫秒或随机延迟范围。6. 高级技巧验证码识别集成与扩展开发对于无法绕过的复杂验证码集成识别能力是终极方案。这通常需要开发Burp扩展。6.1 使用现有扩展Captcha Killer 与 Turbo IntruderBurp Suite 202x 的Burp BApp Store中可能有一些验证码识别相关的扩展但稳定性和通用性参差不齐。需要仔细甄别。Turbo Intruder一个高性能的爆破扩展支持Python脚本。你可以在脚本中编写逻辑在每次请求前先发起一个获取验证码图片的请求调用OCR函数或打码平台API进行识别然后将识别结果填入主请求的载荷中。这需要较强的脚本能力。6.2 自定义扩展开发思路基于Montoya API对于专业的渗透测试团队开发一个自定义扩展是值得的。核心流程如下实现IIntruderPayloadGenerator接口这个接口负责在Intruder攻击中生成动态载荷。在生成器中 a.getNextPayload()方法被调用时首先向目标验证码图片URL如/captcha.php发起一个HTTP请求。 b. 将返回的图片字节流通过HTTP POST发送到你配置的打码平台API。 c. 解析打码平台返回的JSON提取识别出的文本。 d. 将这个文本作为本次的Payload返回。处理会话确保获取验证码和提交登录的请求使用同一个会话Cookie这通常需要扩展同时实现IHttpListener来管理会话状态。错误处理加入重试、识别失败处理等逻辑。实操心得与打码平台集成时务必购买足够的题分并进行充分的测试调用确保API稳定。在扩展中加入缓存机制对同一会话短期内相同的验证码图片URL直接返回缓存结果可以节省成本和时间。7. 常见问题、排查技巧与防御建议7.1 爆破过程中常见问题问题现象可能原因排查思路所有请求返回相同错误如“验证码错误”1. 验证码不可重用且未正确更新。2. 会话丢失导致验证码与请求不匹配。3. 请求头如Content-Type不正确。1. 在Project options - Sessions中配置会话处理规则确保Cookie被正确携带。2. 使用Logger等扩展查看每个请求的完整内容对比与浏览器手动发送的请求差异。3. 检查验证码字段名是否正确是否有多余或缺失的参数。请求几次后连接被重置或IP被封触发了目标的速率限制或WAF规则。1. 在Intruder的Resource pool中大幅降低线程数增加请求延迟如3-5秒。2. 使用代理池轮换源IP需配置Burp上游代理。3. 尝试在非高峰时段测试。Intruder显示成功但响应体是错误页面可能成功跳转到了登录后的页面但Intruder的检测器Grep – Match设置不当。1. 在Intruder的Options - Grep – Match中添加一个标志成功的关键词如Welcome, admin或Logout。2. 更可靠的方法是检查响应长度Length成功页面的长度通常与错误页面显著不同。Recursive grep提取Token失败1. 提取规则写得不准确。2. 响应结构发生变化如登录失败后跳转到不同页面。1. 使用ExtractorBurp自带的提取工具调试提取规则确保它能从响应中准确抓取到值。2. 在Options - Grep – Extract中添加多个备选规则或使用更宽泛的正则表达式。7.2 给开发者的防御建议作为测试的另一方面了解如何防御同样重要服务器端一次性校验验证码使用后立即在服务端会话中标记为失效无论验证对错。强会话绑定将验证码与生成它的会话ID强关联存储在服务端如Session或Redis杜绝跨会话使用。增加噪音与扭曲使用成熟的验证码库如Google reCAPTCHA v3 极验行为验证增加机器识别的难度。但要注意用户体验。实施严格的速率限制不仅对登录失败次数也对验证码获取频率进行限制如每IP每分钟最多获取5次每天最多失败20次。验证码生命周期设置较短的过期时间如2分钟。前端校验仅为辅助所有安全相关的校验必须在服务端最终执行。永远不要信任客户端传来的任何状态标识。7.3 个人实操体会在实际的授权测试中完全依赖自动化爆破验证码登录的情况并不多。更多的时候验证码的存在会促使测试者去挖掘其他漏洞比如密码重置逻辑缺陷、短信轰炸、会话固定等。Burp Suite在这其中的价值在于它提供了一个高度可定制和可视化的平台让你能够将各种想法如会话处理、载荷生成、响应提取快速组合成一条攻击链。我个人的经验是面对验证码首先花30分钟进行彻底的手工逻辑测试重用、绑定、前端绕过这往往比直接上自动化工具更有效率。如果逻辑上无懈可击再评估识别成本与测试收益。很多时候绕过验证码的“漏洞”并不在验证码本身而在与之相关的业务逻辑深处。保持这种探索的心态才是用好Burp这类工具的关键。最后记得在测试报告里不仅要写出漏洞更要清晰地描述你的测试步骤和流量证据这样开发团队才能精准地修复它。