让Burp扫描器看穿Base64包装参数:自定义扫描插入点完全实战(burp-api-drops)

📅 2026/8/27 17:51:18
让Burp扫描器看穿Base64包装参数:自定义扫描插入点完全实战(burp-api-drops)
让Burp扫描器看穿Base64包装参数自定义扫描插入点完全实战burp-api-drops【免费下载链接】burp-api-dropsburp插件开发指南项目地址: https://gitcode.com/gh_mirrors/bu/burp-api-dropsburp-api-drops 是一个面向初学者的 Burp 插件开发教程项目。本文带你通过真实案例学会用自定义扫描插入点IScannerInsertionPointProvider开发 Burp 扫描插件让 Burp 扫描器自动解码 Base64 包装的参数、精准注入 payload 再重新编码回去不再对加密参数睁眼瞎。一、Burp扫描器为什么看不见Base64包装的参数很多现代 Web 应用为了让参数看起来不可读会把真正的键值对整体 Base64 编码再叠加 URL 编码后塞进一个普通参数里传输例如POST / HTTP/1.1 Content-Type: application/x-www-form-urlencoded dataaW5wdXQ9MTExMSZ0aW1lPTE2MjgzMjYxNjgyMjE解码之后才发现里面其实是input1111time1628326168221。这对扫描器是致命的Burp Scanner 默认把一个 HTTP 参数当作一个扫描插入点它会以为data的值就是那一长串乱码直接把 payload 追加或替换到整个 Base64 字符串上。结果服务端解码失败、业务直接报错payload 根本没有碰到真正的input字段——扫描等于白扫。类似的合并参数场景也很常见多个查询值被打包进一个参数里 记住这个痛点参数被序列化/编码封装后扫描器默认的插入点粒度就失效了——这正是自定义扫描插入点要解决的问题。二、自定义扫描插入点是什么1个Provider 1个Point要让 Burp 扫描器看穿参数需要实现两个接口完整示例见 src/burp/Lession10CustomInsertpoint.java 所在的项目文件接口职责关键方法IScannerInsertionPointProvider扫描器分析请求时调用它让你发现自定义插入点getInsertionPoints()IScannerInsertionPoint描述往哪里插、怎么插buildRequest()/getBaseValue()其中buildRequest(payload)是灵魂方法Burp 把每一个 payload 传给你你负责解码原始参数 → 把 payload 放到真正的位置 → 重新编码 → 返回完整的新请求包。Burp 主程序和插件之间的协作逻辑很简单理解了下图就理解了所有 Burp 插件的注册模式⚠️ 注意 Burp 插件的硬性规范实现类必须放在burp包下、类名必须叫BurpExtender、必须实现IBurpExtender接口。三、一键上手3步加载 burp-api-drops 示例插件第 1 步获取项目git clone https://gitcode.com/gh_mirrors/bu/burp-api-drops cd burp-api-drops mvn clean package构建完成后target/目录下会生成带依赖的 jar 包打包配置见 pom.xml。第 2 步在 Burp 中加载 jar打开 Burp 的Extender面板 →Extensions页签 →Add类型选Java然后选择刚才打好的 jar 文件点击加载第 3 步确认插件生效加载成功后Details列表里会出现Serialized input scan insertion point这个插件Output面板显示启动日志即表示注册成功。之后对目标站点发起 Active Scan插件就会自动接管 Base64 参数的扫描。四、自定义扫描插入点实现详解解码→注入→重编码核心代码就在src/burp/Lession10CustomInsertpoint.java整体只有三个步骤。步骤1注册 Providercallbacks.setExtensionName(Serialized input scan insertion point); callbacks.registerScannerInsertionPointProvider(this);步骤2getInsertionPoints() 中发现目标参数扫描器每分析一个请求就会调用该方法。我们只需取出名为data的参数并返回一个自定义插入点找不到就返回null说明这个请求不需要我们处理IParameter dataParameter helpers.getRequestParameter(baseRequestResponse.getRequest(), data);步骤3解码、切分、定位真正要攻击的位置在构造插入点时先把data的值做 URL 解码 Base64 解码还原成可读的键值对再按input与切出三段// URL解码、Base64解码后的字符串类似input1111time1628326168221 dataParameter helpers.bytesToString( helpers.base64Decode(helpers.urlDecode(dataParameter)));解码效果如下图所示——左边是请求包里的原始 Base64 参数右边解码后暴露出真正的input字段insertionPointPrefixinput之前的部分空baseValueinput的原始值扫描报告里展示的基础值insertionPointSuffixtime...这一段必须原样保留步骤4buildRequest() 注入 payload 并重新编码这是看穿 Base64的核心只有 5 行// 前缀 payload 后缀拼回完整键值对 String input insertionPointPrefix helpers.bytesToString(payload) insertionPointSuffix; // 重新 Base64 编码 URL 编码 input helpers.urlEncode(helpers.base64Encode(input)); // 用新值更新原始请求中的 data 参数 return helpers.updateParameter(baseRequest, helpers.buildParameter(data, input, IParameter.PARAM_BODY));✅ 至此Burp 发出去的每一个 payload 都会被正确地藏回 Base64 包装里服务端解码后 payload 恰好落在input字段上——扫描精度完全恢复。五、验证扫描效果用Logger确认插入点工作正常插件加载后建议配置日志工具来亲眼确认请求包的变化。打开Logger的 Options 页签勾选Scanner与Extender来源即可同时看到扫描器发出的原始请求和被插件改造后的请求验证要点请求中的data参数值每次都在变化payload 已注入手动把data值 Base64 解码后能看到 payload 正好在input后面Burp 扫描报告Scan Issues中插入点名称会显示为插件定义的Base64-wrapped input 新版 Burp 自带的 Logger 也能捕获 Extender 产生的流量Project options → Logging中勾选原理相同。六、搭配IScannerCheck把扫描结果变成漏洞报告只有插入点还不够还需要告诉 Burp 什么响应算有漏洞。项目里的src/burp/Lession10.java演示了完整的IScannerCheck实现两个方法分工明确doPassiveScan()只分析响应包强烈建议不发送任何请求doActiveScan()向插入点注入 payload、发送请求、比对响应特征byte[] checkRequest insertionPoint.buildRequest(INJ_TEST); IHttpRequestResponse resp callbacks.makeHttpRequest( baseRequestResponse.getHttpService(), checkRequest);命中响应特征字符串后构造IScanIssue对象并返回ListIScanIssue即可。这个插入点和 Check 插件同时加载就是一条完整的Base64 参数自动扫描流水线。七、Burp扫描插件开发的4个必知避坑点以下都是 README 中总结的实战经验详见 README.md 第十章一些tips⚠️buildRequest()是替换原始值不是追加。想保留原值要自己拼getBaseValue() payload。⚠️插件里千万别用System.exit(0)会把整个 Burp 主程序一起退出✅上报漏洞优先用返回 ListIScanIssue的方式而不是callbacks.addScanIssue()——前者会自动去重且同时在 Scan Queue 和 Target 面板留痕后者在 Scan Queue 中无记录容易漏报。⚠️当原始请求返回 500 时Burp 默认不再调用doActiveScan()这类静默跳过逻辑可能导致漏报开发复杂扫描器时要心中有数。八、总结本文用 burp-api-drops 项目中的真实案例完整走通了让 Burp 扫描器看穿Base64 包装参数的全过程问题参数被 Base64/URL 编码封装后Burp 默认插入点粒度失效payload 打不中真实字段方案实现IScannerInsertionPointProvider在buildRequest()里完成解码 → 注入 payload → 重编码验证配合 Logger 观察改造后的请求包确认插入点名称出现在扫描报告中进阶搭配IScannerCheck输出漏洞报告并注意替换式注入、System.exit、漏洞去重等坑点建议通读项目 README.md 的完整章节从环境搭建、HTTP 数据包处理到扫描插件开发所有示例代码均可在src/burp/目录下找到注意把对应文件改名为BurpExtender.java后再构建加载。掌握自定义扫描插入点后你就不再局限于能扫的参数而是想让扫描器扫哪里它就扫哪里。【免费下载链接】burp-api-dropsburp插件开发指南项目地址: https://gitcode.com/gh_mirrors/bu/burp-api-drops创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考