1. 为什么 Burpsuite 暴力破解总卡在验证码这一关做 Web 安全测试的朋友大概率都遇到过这个场景用 Burpsuite 的 Intruder 模块跑登录接口的密码字典跑到一半发现目标站点每次登录失败后都会刷新一张四位字符的图形验证码Payload 里填的验证码和服务器 Session 里存的对不上于是后面几千条请求全部返回“验证码错误”爆破直接变成无效流量。这个问题的本质是Burpsuite 本身只负责发请求和替换 Payload它不具备“看图识字”的能力。传统做法是挂一个 OCR 插件比如 Captcha Killer 或者 reCAPTCHA 之类的扩展但这类插件对扭曲字符、干扰线、点阵噪声的识别率很低稍微复杂一点的验证码就歇菜了。而多模态大模型在图像文字识别上的表现已经相当能打把验证码图片丢给视觉模型让它返回识别结果再通过 Burpsuite 的扩展接口把结果塞回请求参数里整条链路就通了。这篇要交付的就是这样一套流程用 TaoToken 的统一 Key 作为模型调用通道写一个 Burpsuite 的 Python 扩展基于 Jython 或 Montoya API在 Intruder 每次发起请求前先抓取当前 Session 的验证码图片调用视觉模型识别把识别结果写入 Payload 位置然后继续爆破。适合已经会用 Burpsuite 基础功能、想解决验证码识别痛点的安全测试人员也适合想把多模态模型接入自动化工具链的开发者。整条链路涉及三个部分TaoToken 的 Key 申请与模型选择、Burpsuite 扩展的 config.toml 配置骨架、以及联动验证的具体步骤。下面按顺序拆开讲。2. TaoToken 前置准备统一 Key 与视觉模型通道TaoToken 在这里扮演的角色是“模型调用的统一入口”。你不需要分别去对接多家模型厂商的 SDK也不需要维护多套鉴权逻辑一个 Key 就能调用包括视觉理解模型在内的多种能力。对于 Burpsuite 扩展这种需要轻量、快速集成的场景来说统一 Key 省掉了大量适配工作。2.1 获取 API Key访问 TaoToken 官网 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 注册账号后进入控制台。在 API Keys 页面创建一个新的 Key复制保存。这个 Key 就是后续所有模型调用的凭证。控制台地址https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleAPI Keys 管理页https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keys注意Key 只在创建时完整显示一次务必当场复制到安全位置。如果泄露立即在控制台吊销并重建。2.2 确认 API 端点与模型TaoToken 的 API 基础地址是 https://taotoken.net/api 兼容 OpenAI 风格的接口格式。也就是说你可以用标准的/v1/chat/completions端点来发起请求消息体里用image_url类型传入 base64 编码的验证码图片。模型选择上验证码识别属于图像文字提取任务选一个视觉理解能力强的模型即可。在模型对话页面可以先手动测试识别效果模型对话入口https://taotoken.net/model-chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel-chat你可以上传一张验证码截图问模型“这张图里的字符是什么只返回字符本身”看看返回结果是否干净。如果模型返回了多余的解释文字在后续的 Prompt 里加一句“只输出识别结果不要任何其他文字”就能约束住。2.3 为什么不用本地 OCR有人会问Tesseract 或者 ddddocr 不是也能识别验证码吗确实可以但有几个现实问题第一本地 OCR 对扭曲、粘连、彩色干扰线的验证码识别率下降明显第二你需要额外维护 OCR 库的依赖环境在 Burpsuite 的 Jython 环境里装第三方库并不轻松第三多模态模型对新型验证码的泛化能力更强不需要针对每种验证码单独调参。用 TaoToken 的统一通道相当于把识别能力外包给模型Burpsuite 扩展只需要负责“截图→发请求→取结果→填参数”这四个动作。3. 可复制配置config.toml 骨架与 Burpsuite 扩展代码这一章是核心交付。先给 config.toml 的配置骨架再给 Burpsuite 扩展的 Python 代码最后说明如何在 Burpsuite 里加载。3.1 config.toml 配置骨架在 Burpsuite 扩展脚本的同级目录下创建config.toml内容如下[taotoken] # TaoToken 统一 API 端点 api_base https://taotoken.net/api # 在控制台创建的 API Key api_key sk-你的Key粘贴在这里 # 视觉模型名称按控制台实际可用的模型填写 model gpt-4o # 请求超时秒 timeout 30 # 最大重试次数 max_retries 2 [captcha] # 验证码图片在响应中的定位方式css_selector 或 regex locate_mode regex # 用于从 HTML 中提取验证码图片 URL 的正则 img_url_regex src(/captcha[^]) # 验证码在请求中的参数名 param_name captcha # 识别结果长度限制防止模型返回多余内容 max_length 8 [burp] # Intruder 中验证码参数对应的 Payload 位置编号从 1 开始 payload_position 2 # 每次请求前是否刷新验证码 refresh_before_request true几个关键参数说明api_base固定为https://taotoken.net/api不要加 UTM 参数这是给程序调用的地址。model字段填你在模型对话页面测试通过的那个视觉模型名称。不同模型对图像的理解粒度不同建议先用一张实际验证码测试。img_url_regex需要根据目标站点的实际 HTML 结构调整。打开浏览器开发者工具找到验证码img标签看它的src属性长什么样然后写对应的正则。比如src/api/captcha?t123456正则就写src(/api/captcha[^])。payload_position是 Intruder 里验证码参数对应的位置编号。假设你的请求是usernameadminpassword§123456§captcha§0000§那么密码是位置 1验证码是位置 2。3.2 Burpsuite 扩展代码Burpsuite 支持 Jython 编写的 Python 扩展。确保你已经安装了 Jython standalone JAR 并在 Burpsuite 的 Extender 设置里配置了 Jython 路径。创建captcha_bridge.py# -*- coding: utf-8 -*- from burp import IBurpExtender, IHttpListener, IIntruderPayloadGeneratorFactory from burp import IIntruderPayloadGenerator import base64 import json import re import urllib2 import tomllib # Jython 2.7 需用 toml 库替代见下方说明 # 如果 Jython 环境没有 tomllib用简单的 ini 解析替代 try: import tomllib except ImportError: tomllib None class BurpExtender(IBurpExtender, IHttpListener): def registerExtenderCallbacks(self, callbacks): self._callbacks callbacks self._helpers callbacks.getHelpers() callbacks.setExtensionName(TaoToken Captcha Bridge) callbacks.registerHttpListener(self) self.config self._load_config(config.toml) self.current_captcha print([TaoToken] 扩展已加载配置读取完成) def _load_config(self, path): # 简易 TOML 解析生产环境建议用 toml 库 cfg {} section None with open(path, r) as f: for line in f: line line.strip() if not line or line.startswith(#): continue if line.startswith([) and line.endswith(]): section line[1:-1] cfg[section] {} elif in line and section: k, v line.split(, 1) k k.strip() v v.strip().strip().strip() cfg[section][k] v return cfg def processHttpMessage(self, toolFlag, messageIsRequest, messageInfo): if not messageIsRequest: return # 在 Intruder 发起请求前如果验证码为空则先获取 if self.current_captcha : self.current_captcha self._fetch_and_recognize(messageInfo) def _fetch_and_recognize(self, messageInfo): cfg self.config # 1. 先发一个 GET 请求获取验证码图片 # 这里简化处理实际需要根据目标站点构造请求 captcha_url self._extract_captcha_url(messageInfo) if not captcha_url: return 0000 img_bytes self._download_image(captcha_url, messageInfo) if not img_bytes: return 0000 # 2. 调用 TaoToken 视觉模型识别 result self._call_vision_model(img_bytes) return result def _extract_captcha_url(self, messageInfo): # 从当前请求的响应中提取验证码 URL # 实际使用时需要先请求一次登录页获取 HTML return None def _download_image(self, url, messageInfo): try: req urllib2.Request(url) resp urllib2.urlopen(req, timeout10) return resp.read() except Exception as e: print([TaoToken] 下载验证码失败: %s % str(e)) return None def _call_vision_model(self, img_bytes): cfg self.config[taotoken] b64 base64.b64encode(img_bytes) payload { model: cfg[model], messages: [ { role: user, content: [ {type: text, text: 识别这张验证码图片中的字符只输出字符本身不要任何解释。}, {type: image_url, image_url: {url: data:image/png;base64, b64}} ] } ], max_tokens: 20 } req urllib2.Request( cfg[api_base] /v1/chat/completions, datajson.dumps(payload), headers{ Content-Type: application/json, Authorization: Bearer cfg[api_key] } ) try: resp urllib2.urlopen(req, timeoutint(cfg[timeout])) data json.loads(resp.read()) text data[choices][0][message][content].strip() # 清理非字母数字字符 text re.sub(r[^a-zA-Z0-9], , text) return text[:int(self.config[captcha][max_length])] except Exception as e: print([TaoToken] 模型调用失败: %s % str(e)) return 0000注意上面代码是骨架版本_extract_captcha_url需要你根据目标站点的实际流程补全。核心逻辑是先 GET 登录页拿到验证码图片 URL下载图片调 TaoToken 识别把结果缓存起来供 Intruder 使用。3.3 在 Burpsuite 中加载扩展打开 Burpsuite进入 Extender → Extensions 标签页。点击 AddExtension type 选择 Python选择captcha_bridge.py文件。加载成功后Output 区域会打印[TaoToken] 扩展已加载配置读取完成。如果报错ImportError: No module named urllib2说明 Jython 环境配置有问题检查 Extender → Options 里的 Python environment 是否指向了正确的 Jython JAR。如果报错IOError: config.toml说明配置文件路径不对。把config.toml放到 Burpsuite 启动目录下或者在代码里写绝对路径。4. 联动验证跑通一次带验证码识别的爆破配置和代码就绪后按下面的步骤做一次完整验证。4.1 抓取登录请求打开目标站点的登录页输入任意用户名密码和验证码提交。在 Burpsuite 的 Proxy → HTTP history 里找到这个 POST 请求右键 Send to Intruder。4.2 设置攻击位置在 Intruder → Positions 标签页Clear 所有自动标记的 Payload 位置。然后手动选中密码字段的值点击 Add 标记为位置 1选中验证码字段的值点击 Add 标记为位置 2。确认 Payload 位置编号和 config.toml 里的payload_position 2一致。4.3 配置 Payload位置 1密码加载你的密码字典文件。位置 2验证码的 Payload type 选择 Extension-generated然后选择TaoToken Captcha Bridge生成器。4.4 发起攻击并观察点击 Start attack。观察 Intruder 的攻击结果表格重点看每次请求的响应长度和状态码。如果验证码识别正确你会看到大部分请求返回“密码错误”而不是“验证码错误”。当某条请求的响应长度明显不同或者状态码变成 302 跳转大概率就是密码命中了。在 Burpsuite 的 Extender → Output 里可以看到每次模型调用的日志。如果识别失败会打印[TaoToken] 模型调用失败并返回默认值0000。4.5 验证识别准确率单独测试识别环节在模型对话页面 https://taotoken.net/model-chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel-chat 上传同一张验证码图片对比模型返回结果和 Burpsuite 扩展返回结果是否一致。如果一致说明链路通了如果不一致检查 base64 编码是否正确、图片格式是否被模型支持。实测下来清晰无干扰的验证码识别准确率很高带干扰线的也能到可用水平。如果目标站点的验证码特别复杂可以在 Prompt 里加一句“忽略干扰线和噪点只识别主要字符”。5. 本篇常见错排查5.1 模型返回空字符串或乱码最常见的原因是 base64 编码时没有去掉换行符。Python 的base64.b64encode返回的字节串里可能包含\n在拼接 data URL 之前要确保是纯 base64 字符。可以用b64.replace(\n, )处理。另一个原因是图片格式不被支持。TaoToken 的视觉接口通常支持 PNG、JPEG、GIF、WebP。如果验证码是 BMP 格式先转成 PNG 再传。5.2 每次请求验证码都变但识别结果没更新检查扩展代码里的current_captcha缓存逻辑。如果refresh_before_request true应该在每次请求前重新获取验证码并识别而不是复用上一次的结果。上面的骨架代码里current_captcha只在为空时获取实际使用时要改成每次请求都刷新。5.3 Intruder 报错 “Payload generator returned null”说明扩展的IIntruderPayloadGenerator接口没有正确实现。Burpsuite 的 Intruder 扩展需要实现IIntruderPayloadGeneratorFactory和IIntruderPayloadGenerator两个接口generatePayload方法返回识别结果字符串hasNext返回 True。上面的骨架代码只实现了IHttpListener需要补充 Intruder 相关的接口实现。5.4 请求超时或 429 限流如果爆破字典很大每次请求都调一次模型可能会触发限流。两个优化方向第一在扩展里加本地缓存相同验证码图片不重复调用第二降低并发线程数Intruder 的 Resource Pool 里把最大并发请求数调到 5 以下。5.5 验证码参数名不对不同站点的验证码参数名不一样有的是captcha有的是code有的是verifyCode。在 config.toml 的param_name里填对否则识别结果填到了错误的位置服务器自然不认。5.6 模型识别结果带了多余字符比如返回“识别结果AB12”而不是“AB12”。在 Prompt 里明确要求“只输出字符本身”同时在代码里用正则re.sub(r[^a-zA-Z0-9], , text)做二次清理。如果验证码包含中文或特殊符号调整正则的字符集。6. 接入文档与后续扩展整条链路跑通后你可以把验证码识别模块独立出来复用到其他自动化工具里。TaoToken 的 API 兼容 OpenAI 格式意味着任何支持自定义 API 端点的工具都能接进来。接入文档地址https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdoc如果你后续要做更复杂的自动化编码任务比如让 Agent 自动分析爆破结果、生成测试报告可以考虑 Coding PlanCoding Plan 入口https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-plan对于需要长期跑自动化任务的场景Coding Plan 在调用配额和稳定性上更适合持续集成。最后提醒一句暴力破解测试仅限你拥有明确授权的目标。未经授权的渗透测试是违法行为技术本身没有对错用在哪里才是关键。
企业数字化 ERP 产品动态
相关推荐
AI改文档总翻车?用Git搭一套后悔药机制 AI 改文档这件事,用好了是效率神器,用翻了就是返工灾难。我自己的翻车经历就挺典型:让 AI 帮忙“润色”一份技术方案,它把标题梳理得漂漂亮亮,却把接口延迟参数从 37ms 悄悄改成了 50ms,还删掉了一段部署环… · 2026/9/26 6:57:53
共享厨房租赁系统开发实战:Spring Boot+MyBatis设计核心 做共享厨房租赁这个选题的毕设,在很多老师眼里可能觉得就是个普通的管理系统,但我自己做完一遍之后最大的感受是:业务逻辑的深度决定了这个项目的上限。技术框架确实就是Spring Boot那一套,难点全在“租赁”这两个字——怎么设计订… · 2026/9/26 6:57:53
Apache APISIX 演进史:从颠覆 Kong 到顶级 AI 网关 在当今云原生基础设施与大规模分布式系统领域,Apache APISIX 是中国开源项目走向国际顶级开源软件基金会最为耀眼的标杆之一。
今天,无论是在腾讯、百度、Bilibili、中国移动等国内互联网与运营商的生产集群中,还是在欧盟数字机构、Airbus&am… · 2026/9/26 6:57:53
iMessage“三角测量”攻击链样本捕获实战:从监测网搭建到模块拆解 先说结论:这篇不是漏洞利用代码的复现教程,而是一个恶意样本分析师的“捕获复盘”。如果你在追踪代号为“三角测量”的这类iMessage攻击链,最核心的瓶颈往往不是漏洞本身有多难,而是你手上根本没拿到那个样本。这篇系列第7篇&… · 2026/9/26 6:57:41
GPT Images 2.5 与 AI 自主推进工作:从图像理解到任务闭环的工程实践 1. 从“ZHO 用 GPT Images 2.5 演示 AI 自主推进工作”说起:这个演示到底在讲什么第一次看到“ZHO 用 GPT Images 2.5 演示 AI 自主推进工作”这个标题,我脑子里冒出来的第一个念头不是“又一个模型更新”,而是“自主推进”这四个字。模型迭代… · 2026/9/26 6:57:35
VMwareTools-10.3.2-9925305.tar 安装指南与避坑实践 简介:VMwareTools-10.3.2-9925305.tar 是面向在 VMware 平台上运行 Ubuntu 及其他 Linux 发行版用户的一套虚拟化增强工具集,版本号 10.3.2、构建编号 9925305,主要用于解决虚拟机性能偏低、图形显示受限、鼠标无法无缝切换以及宿主机与虚拟机… · 2026/9/26 6:57:35
数据库课后习题答案别硬背:当测试用例集刷,效率翻倍 简介:万常选版《数据库原理与设计》课后习题答案资源,覆盖第2至6章及第9章,适合正在学习关系模型、数据库建模、关系数据理论与模式求精的本科生、自学者作为复习与自测材料。压缩包共7个文件,含3个doc参考答案、2个sql示例脚本、… · 2026/9/26 0:00:21
OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 0:00:40
向下兼容与向上兼容:接口设计中的兼容性策略与工程实践 一次版本升级事故,是很多团队绕不过去的坎。线上环境里,服务端明明已经上线了新版接口,老的移动端还在照着旧文档传参数。请求一到网关,校验直接拒绝,用户操作失败,客服群炸了锅,开发群里开始互… · 2026/9/26 0:00:46