ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

皮卡丘靶场暴力破解实战:验证码与Token防护绕过详解

皮卡丘靶场暴力破解实战:验证码与Token防护绕过详解 1. 从皮卡丘靶场说起暴力破解到底在打什么皮卡丘靶场pikachu是国内安全圈子里流传很广的一个 Web 漏洞练习平台覆盖了 SQL 注入、XSS、CSRF、文件包含、暴力破解等常见漏洞类型。很多人第一次接触它是在学习 Web 安全基础的时候而“暴力破解”这一关往往是新手从“只会点按钮”到“真正理解认证逻辑”的分水岭。暴力破解Brute Force的本质非常朴素认证系统要求你提交用户名和密码那我就把所有可能的组合一个一个试过去直到撞对为止。听起来很笨但它的可怕之处在于——如果服务端没有做任何频率限制、没有验证码、没有锁定机制那么一个脚本就能在几分钟内跑完几万条字典。皮卡丘靶场的暴力破解模块就是把这几种防护层层递进地摆出来让你亲手体验“有防护”和“没防护”之间的差距。这篇文章要聊的是皮卡丘靶场暴力破解关卡中比较有代表性的两个场景基于验证码的防护绕过和基于 Token 的防护绕过。前者考察的是你能不能识别出验证码机制的设计缺陷后者考察的是你对服务端会话状态管理的理解深度。两个场景都会用到 Burp Suite 作为核心工具配合 Intruder 模块完成自动化攻击。适合谁看如果你已经搭好了皮卡丘靶场能正常访问暴力破解页面但对“为什么加了验证码还是能被爆破”感到困惑或者对 Burp Intruder 的配置总是似懂非懂那这篇内容就是写给你的。我会把每一步的操作意图、参数选择理由、以及实际踩过的坑都讲清楚让你不只是“照着做能通”而是真正理解背后的逻辑。注意本文所有内容仅用于本地靶场环境下的安全学习请勿将任何技术用于未授权的系统测试。2. 环境准备与靶场搭建要点2.1 皮卡丘靶场的部署方式选择皮卡丘靶场的搭建方式主要有两种一种是直接用 PHP 集成环境比如 phpStudy、XAMPP把源码跑起来另一种是用 Docker 拉取现成的镜像。两种方式各有优劣我分别说一下实际体验。用 phpStudy 这类集成环境的好处是“所见即所得”源码目录直接暴露在你面前你可以随时打开 PHP 文件看服务端逻辑这对理解漏洞成因非常有帮助。缺点是环境配置有时候会出幺蛾子比如 PHP 版本不兼容、MySQL 连接失败之类的。皮卡丘官方推荐的是 PHP 5.4 以上版本实测 PHP 7.x 也能跑但个别关卡可能有兼容性问题。Docker 方式的好处是一键启动环境隔离干净不会污染你本机的开发环境。命令大概是这样docker pull area39/pikachu docker run -d -p 8080:80 area39/pikachu启动后访问http://localhost:8080就能看到靶场首页。Docker 方式的问题在于你不太方便直接改源码来观察服务端行为变化但对于纯练习来说完全够用。我个人的建议是如果你是想认真理解每个漏洞的原理用 phpStudy 把源码跑起来随时能看 PHP 文件如果你只是想快速练习工具操作Docker 更省事。2.2 Burp Suite 的配置与代理设置Burp Suite 是这次实战的核心工具社区版Community Edition就够用Intruder 模块虽然有限速但跑皮卡丘这种本地靶场完全没问题。如果你有 Professional 版Intruder 的速度会快很多但不是必须的。配置 Burp 代理的步骤打开 Burp Suite进入 Proxy - Options确认代理监听地址是127.0.0.1:8080默认值。浏览器端设置代理指向127.0.0.1:8080。推荐用 Firefox 配合 FoxyProxy 插件切换代理很方便。导入 Burp 的 CA 证书到浏览器否则 HTTPS 站点会报证书错误。虽然皮卡丘靶场是 HTTP 的但养成导入证书的习惯对后续测试其他站点有好处。代理配好之后打开皮卡丘靶场的暴力破解页面随便输入一个用户名密码提交一次然后在 Burp 的 Proxy - HTTP History 里找到这个请求右键发送到 Intruder。这就是后续所有攻击的起点。实操心得很多人卡在“Burp 抓不到包”这一步90% 的情况是浏览器代理没生效或者 Burp 的拦截开关Intercept is on没关。建议先把 Intercept 关掉让流量正常通过只在 HTTP History 里观察请求需要改包的时候再手动发送到 Repeater 或 Intruder。2.3 字典文件的准备暴力破解离不开字典。皮卡丘靶场的暴力破解关卡用户名通常是admin密码是常见弱口令之一。你可以自己准备一个小字典也可以直接用 Kali 自带的/usr/share/wordlists/目录下的字典文件。对于皮卡丘靶场我建议先准备一个精简字典包含几十到几百个常见密码就够了比如123456 password admin admin123 root 12345678 qwerty abc123 letmein monkey这个字典跑起来很快适合快速验证攻击流程。等流程跑通了再换大字典做压力测试。3. 验证码防护的绕过思路与实操3.1 验证码机制的设计缺陷分析皮卡丘靶场的暴力破解关卡中有一个场景是“加了验证码的登录”。页面上会显示一个图形验证码要求你输入用户名、密码和验证码。表面上看验证码的存在阻止了自动化脚本——因为脚本无法识别图片里的字符。但问题在于这个验证码的实现方式存在一个经典缺陷验证码的校验逻辑与登录逻辑是分离的而且验证码在服务端没有与当前会话强绑定。具体来说服务端的处理流程大致是这样的客户端请求登录页面服务端生成一个验证码图片同时把验证码的值存到 Session 里。用户提交表单服务端先校验验证码是否正确。如果验证码正确再校验用户名密码。如果验证码错误直接返回“验证码错误”不进行密码校验。这个流程看起来没问题但关键在于验证码校验通过后Session 里的验证码值是否被清除如果服务端在验证码校验通过后没有立即销毁 Session 中的验证码那么同一个验证码就可以被重复使用。这就意味着攻击者只需要手动识别一次验证码然后在后续的暴力破解请求中一直使用这个验证码就能绕过验证码防护。皮卡丘靶场的这个关卡正是存在这个问题。你可以用 Burp 抓一次登录请求观察验证码字段的值然后在 Intruder 中把验证码字段设为固定值只对密码字段进行爆破。3.2 利用 Burp Intruder 实现验证码复用攻击具体操作步骤如下第一步抓取登录请求在浏览器中输入用户名admin、密码123456、验证码手动识别图片中的字符提交。在 Burp HTTP History 中找到这个 POST 请求观察请求体usernameadminpassword123456captchaabcdsubmitLogin第二步发送到 Intruder右键请求 - Send to Intruder。在 Intruder 的 Positions 标签页中Burp 会自动标记出可能的注入点。我们需要手动调整清除所有自动标记的注入点点“Clear”按钮。选中密码字段的值123456点“Add”标记为注入点。确认验证码字段captchaabcd没有被标记为注入点保持固定值。第三步配置 Payload进入 Payloads 标签页Payload set 选择 1Payload type 选择“Simple list”。在 Payload Options 中粘贴你的密码字典。如果你用的是 Burp 社区版Intruder 会有速率限制但跑几十条字典还是很快的。第四步发起攻击点击“Start Attack”。Burp 会依次用字典中的每个密码替换密码字段验证码字段始终保持为abcd。观察响应结果如果某个请求的响应长度明显不同或者响应内容中包含“登录成功”之类的字样那就是正确的密码。注意事项这个攻击能成功的前提是服务端没有在验证码校验通过后销毁 Session 中的验证码。如果服务端每次校验后都重新生成验证码那这个方法就失效了。在实际测试中你需要先验证这一点——手动提交两次相同的验证码看第二次是否还能通过校验。3.3 验证码绕过的其他常见思路除了验证码复用还有一些其他绕过验证码的思路虽然皮卡丘靶场这个关卡不一定都适用但值得了解验证码在客户端校验有些网站把验证码的正确答案直接写在 JavaScript 里或者通过 AJAX 返回给客户端由客户端判断对错。这种设计等于没有防护攻击者直接读取正确答案即可。验证码可被 OCR 识别如果验证码图片非常简单比如纯数字、无干扰线、字体固定可以用 OCR 工具自动识别。Python 的ddddocr库就是专门做这个的识别率很高。不过皮卡丘靶场的验证码有干扰线OCR 识别率一般不如复用来得直接。验证码为空绕过有些系统在验证码字段为空时会跳过验证码校验。你可以尝试删除captcha参数或者把值设为空字符串看是否能绕过。删除验证码参数直接删除请求中的captcha字段看服务端是否会报错。如果服务端没有做严格的参数检查可能会直接跳过验证码校验。这些思路在实际渗透测试中都很常见核心逻辑就是验证码的校验必须发生在服务端而且必须与当前会话强绑定一次性使用。任何环节出问题都可能导致验证码形同虚设。4. Token 防护的绕过与对抗4.1 Token 防护机制的原理皮卡丘靶场的另一个暴力破解关卡引入了 Token 机制。页面上除了用户名和密码还有一个隐藏字段token每次加载页面时服务端会生成一个随机字符串作为 Token同时把这个 Token 存到 Session 里。提交表单时服务端会比对提交的 Token 和 Session 中的 Token 是否一致如果不一致就拒绝请求。这个机制的设计初衷是防止 CSRF跨站请求伪造同时也能在一定程度上阻止暴力破解——因为每次请求都需要一个有效的 Token而 Token 是随机生成的攻击者无法预测。但问题在于Token 的生成和校验逻辑如果存在缺陷同样可以被绕过。皮卡丘靶场的这个关卡Token 的校验逻辑有一个关键问题服务端在校验 Token 后是否立即销毁了 Session 中的 Token如果没有销毁那么同一个 Token 就可以被重复使用。4.2 利用 Burp Intruder 的 Pitchfork 模式绕过 Token如果 Token 可以被复用那攻击方式就和验证码复用类似手动获取一个有效的 Token然后在 Intruder 中把 Token 字段设为固定值只对密码字段进行爆破。但皮卡丘靶场的这个关卡Token 的校验逻辑可能更严格一些——每次请求后 Token 都会刷新。这种情况下简单的固定 Token 就不管用了。你需要用 Burp Intruder 的Pitchfork 模式同时迭代 Token 和密码。具体思路是先用 Burp 的宏Macro功能自动获取每次请求前的有效 Token。在 Intruder 中配置两个 Payload set一个用于 Token一个用于密码。使用 Pitchfork 模式让 Token 和密码一一对应地迭代。这个配置比较复杂我详细说一下步骤第一步录制宏在 Burp 的 Project Options - Sessions - Macros 中点击“Add”录制一个访问登录页面的请求。这个请求的响应中会包含新的 Token 值。配置宏的时候需要指定从响应中提取 Token 的正则表达式比如nametoken value([^])。第二步配置 Session Handling Rules在 Sessions - Session Handling Rules 中添加一条规则让 Burp 在每次 Intruder 请求前都执行宏获取新的 Token并替换请求中的 Token 字段。第三步配置 Intruder在 Intruder 的 Positions 中标记密码字段和 Token 字段为注入点。Payload set 1 用于密码字典Payload set 2 用于 Token但实际上 Token 是由宏动态替换的所以 Payload set 2 可以留空或者用一个占位符。第四步发起攻击Burp 会在每次请求前自动执行宏获取新的 Token然后替换请求中的 Token 字段。这样就能绕过 Token 的动态刷新机制。实操心得这个配置过程很容易出错最常见的坑是正则表达式写错导致 Token 提取失败。建议先在 Repeater 中手动测试宏的效果确认 Token 能被正确提取和替换后再放到 Intruder 中跑。另外Burp 社区版的 Intruder 有速率限制跑大量请求时会很慢建议先用小字典验证流程。4.3 Token 防护的常见缺陷与对抗思路Token 防护机制在实际应用中常见的缺陷包括缺陷类型具体表现对抗思路Token 可复用服务端校验后不销毁 Token固定 Token 爆破Token 可预测Token 生成算法过于简单如时间戳预测 Token 序列Token 未绑定会话Token 与用户会话无关跨会话使用 TokenToken 在客户端生成Token 由 JavaScript 生成分析 JS 逻辑伪造 TokenToken 校验可绕过删除 Token 参数后服务端不报错直接删除 Token 字段皮卡丘靶场的这个关卡主要考察的是 Token 可复用和 Token 动态刷新两种情况。理解了这两种情况的对抗思路基本上就能应对大部分 Token 防护场景。5. 常见问题与排查技巧实录5.1 Burp Intruder 攻击失败的排查思路在实际操作中Intruder 攻击失败是很常见的事情。我整理了一个排查清单按优先级排列检查代理配置确认浏览器代理指向 BurpBurp 的 Intercept 处于关闭状态。如果 Intercept 开着请求会被拦截Intruder 无法正常发送。检查注入点标记在 Intruder 的 Positions 标签页中确认只有目标字段被标记为注入点其他字段保持固定值。如果误标记了其他字段攻击结果会混乱。检查 Payload 配置确认 Payload set 和 Payload type 正确字典内容没有多余的空格或换行。有时候从网页复制字典会带入不可见字符导致攻击失败。检查响应长度差异Intruder 攻击完成后按响应长度排序找长度明显不同的请求。如果所有请求长度都一样说明攻击没有生效可能是注入点标记错误或服务端有额外的防护。检查服务端防护有些服务端会对频繁请求做限速或者在一定次数失败后锁定账户。如果攻击到一半突然全部失败可能是触发了服务端的防护机制。5.2 验证码识别失败的替代方案如果验证码无法复用OCR 识别率又太低可以考虑以下替代方案使用打码平台有些第三方平台提供人工打码服务但这种方式不适合本地靶场练习而且涉及外部服务这里不展开。分析验证码生成逻辑如果验证码是在客户端生成的比如通过 JavaScript 绘制可以直接分析 JS 代码找到验证码的生成算法从而预测验证码值。利用验证码的弱随机性有些验证码的随机数种子是可预测的比如基于时间戳可以通过分析多个验证码样本推测生成规律。绕过验证码校验逻辑尝试删除验证码参数、修改验证码参数类型如数组、对象、或者利用服务端的参数解析差异来绕过校验。5.3 Token 动态刷新的应对策略Token 动态刷新是最难对抗的防护机制之一。除了前面提到的 Burp 宏方案还有一些其他思路多线程并发如果服务端的 Token 校验存在竞态条件Race Condition可以尝试并发发送多个请求看是否能绕过 Token 校验。这种方式在理论上有可行性但实际操作中成功率不高。Token 固定化攻击如果服务端在某个环节没有正确刷新 Token比如只在登录成功后刷新而在登录失败时不刷新可以尝试利用这个窗口期进行爆破。会话固定攻击如果 Token 与 Session ID 绑定而 Session ID 又可以被攻击者控制那么可以通过固定 Session ID 来固定 Token从而绕过动态刷新。这些思路在实际渗透测试中都有应用场景但需要根据具体的服务端实现来调整。皮卡丘靶场的这个关卡主要是让你理解 Token 防护的基本原理和常见缺陷实际环境中的 Token 机制可能更复杂。6. 从靶场到实战暴力破解的防御视角6.1 服务端应该怎么做防护站在防御者的角度要有效防止暴力破解需要从多个层面入手频率限制对同一 IP、同一账户的登录请求做频率限制比如每分钟最多尝试 5 次。超过限制后要么延迟响应要么直接拒绝。账户锁定连续多次登录失败后锁定账户一段时间比如 15 分钟。锁定期间即使密码正确也拒绝登录。验证码机制验证码必须在服务端校验而且必须一次性使用。校验通过后立即销毁 Session 中的验证码值防止复用。Token 机制Token 必须与当前会话强绑定每次请求后立即刷新。Token 的生成必须使用安全的随机数生成器不可预测。多因素认证在密码之外增加短信验证码、邮箱验证码、TOTP 等第二因素。即使密码被爆破攻击者也无法直接登录。日志与监控记录所有登录尝试对异常频率的请求进行告警。及时发现正在进行的暴力破解攻击。6.2 客户端应该注意什么虽然暴力破解主要是服务端防护的问题但客户端也有一些需要注意的地方密码强度用户应该使用强密码避免使用常见弱口令。密码管理器可以帮助生成和存储强密码。不在多个站点复用密码如果一个站点的密码泄露攻击者可以用这个密码去尝试其他站点撞库攻击。启用双因素认证只要站点支持就应该启用双因素认证。这是目前最有效的账户保护手段之一。关注异常登录提醒如果收到异常登录提醒立即修改密码并检查账户安全设置。6.3 暴力破解工具的选择与对比除了 Burp Suite还有一些其他常用的暴力破解工具各有优劣工具名称适用场景优势劣势Burp IntruderWeb 表单爆破与 Burp 代理无缝集成支持宏和 Session 处理社区版有速率限制Hydra多协议爆破支持 SSH、FTP、HTTP 等多种协议配置相对复杂Medusa多协议爆破速度快支持并行对 Web 表单支持一般Patator灵活爆破模块化设计支持自定义学习曲线较陡ffufWeb 模糊测试速度快支持多种过滤主要用于目录扫描表单爆破需额外配置对于皮卡丘靶场这种 Web 表单爆破场景Burp Intruder 是最顺手的选择。如果你需要爆破 SSH、FTP 等服务Hydra 和 Medusa 更合适。7. 我个人的实操体会与建议皮卡丘靶场的暴力破解关卡看起来简单但真正动手做的时候坑还是不少的。我印象最深的一次是配置 Burp 宏的时候正则表达式写错了导致 Token 提取失败Intruder 跑了几百个请求全部返回“Token 错误”。后来在 Repeater 里手动测试宏发现响应中的 Token 字段格式和我想的不一样调整正则后才成功。另一个体会是不要急于跑大字典。很多人一上来就用几万条的字典结果跑了半天发现注入点标记错了或者服务端有频率限制白白浪费时间。正确的做法是先用小字典10 条以内验证流程确认攻击逻辑正确后再换大字典。还有一点理解服务端的校验逻辑比工具操作更重要。Burp Intruder 的配置再熟练如果不理解验证码和 Token 的校验流程就不知道从哪里下手绕过。建议在做每个关卡之前先手动提交几次请求观察服务端的响应变化推测校验逻辑然后再设计攻击方案。最后分享一个小技巧皮卡丘靶场的源码是开放的你可以直接打开对应的 PHP 文件看服务端的校验逻辑。这比黑盒猜测高效得多而且能让你真正理解漏洞的成因。比如暴力破解关卡的 PHP 文件里你能清楚地看到验证码是否被销毁、Token 是否被刷新、密码比对是否用了安全的哈希函数。这种“白盒黑盒”结合的学习方式效果比单纯刷关卡好得多。如果你已经通关了皮卡丘的暴力破解模块下一步可以尝试 DVWA 的暴力破解关卡它的难度分级更细Low、Medium、High 三个级别分别对应不同的防护强度能让你更系统地理解暴力破解与防御的对抗过程。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进