在Burp中处理明文数据同时转发混淆数据的实现方案
可行实现方案
核心思路是给Burp的请求/响应编辑器添加自定义标签,让你在标签里查看、修改解混淆后的内容,同时保证实际发给应用/服务器的还是混淆后的原始数据,完美解决你遇到的矛盾。
具体实现步骤
1. 自定义请求编辑器标签(处理请求的解混淆/重混淆)
实现Burp Extender API中的IRequestEditorTab接口,作用是:
- 自动识别带
<!-- obfuscated标识的混淆请求 - 在新标签里显示Base64解码后的明文内容
- 当你修改明文后,自动重新Base64编码并加上标识,生成可发送给服务器的混淆请求
2. 自定义响应编辑器标签(仅查看解混淆内容)
实现IResponseEditorTab接口,只做解混淆展示:
- 识别带标识的混淆响应,在新标签显示解码后的明文
- 不需要修改响应后转发(应用只认混淆数据),可以设为只读,避免误操作
3. 代理拦截设置
保持Burp代理的默认拦截规则,不要修改响应内容,让原始混淆响应直接转发给应用,确保应用能正常处理;请求则通过自定义标签修改后自动重混淆,由Burp发送给服务器。
关键代码示例(Java)
请求编辑器标签实现
public class PlaintextRequestTab implements IRequestEditorTab { private final IBurpExtenderCallbacks callbacks; private final IExtensionHelpers helpers; private JTextArea textArea; private byte[] currentRequest; public PlaintextRequestTab(IBurpExtenderCallbacks callbacks) { this.callbacks = callbacks; this.helpers = callbacks.getHelpers(); textArea = new JTextArea(); textArea.setFont(new Font(Font.MONOSPACED, Font.PLAIN, 12)); } @Override public String getTabCaption() { return "明文请求"; } @Override public Component getUiComponent() { return new JScrollPane(textArea); } @Override public boolean isEnabled(byte[] content, boolean isRequest) { if (!isRequest) return false; IRequestInfo reqInfo = helpers.analyzeRequest(content); byte[] body = Arrays.copyOfRange(content, reqInfo.getBodyOffset(), content.length); return new String(body).contains("<!-- obfuscated"); } @Override public void setRequest(byte[] content) { currentRequest = content; IRequestInfo reqInfo = helpers.analyzeRequest(content); byte[] body = Arrays.copyOfRange(content, reqInfo.getBodyOffset(), content.length); // 解混淆:移除标识后Base64解码 String obfuscatedContent = new String(body).replace("<!-- obfuscated", ""); byte[] plaintext = helpers.base64Decode(obfuscatedContent); textArea.setText(new String(plaintext)); } @Override public byte[] getModifiedRequest() { String editedPlaintext = textArea.getText(); // 重混淆:Base64编码后追加标识 String reObfuscated = helpers.base64Encode(editedPlaintext.getBytes()) + "<!-- obfuscated"; IRequestInfo reqInfo = helpers.analyzeRequest(currentRequest); return helpers.buildHttpMessage(reqInfo.getHeaders(), reObfuscated.getBytes()); } @Override public boolean isModified() { return !textArea.getText().equals(getCurrentPlaintext()); } private String getCurrentPlaintext() { IRequestInfo reqInfo = helpers.analyzeRequest(currentRequest); byte[] body = Arrays.copyOfRange(currentRequest, reqInfo.getBodyOffset(), currentRequest.length); String obfuscatedContent = new String(body).replace("<!-- obfuscated", ""); byte[] plaintext = helpers.base64Decode(obfuscatedContent); return new String(plaintext); } }
扩展注册代码
public class BurpExtender implements IBurpExtender { private IBurpExtenderCallbacks callbacks; private IExtensionHelpers helpers; @Override public void registerExtenderCallbacks(IBurpExtenderCallbacks callbacks) { this.callbacks = callbacks; callbacks.setExtensionName("明文内容编辑器"); helpers = callbacks.getHelpers(); // 注册请求和响应编辑器标签 callbacks.registerRequestEditorTab(new PlaintextRequestTab(callbacks)); callbacks.registerResponseEditorTab(new PlaintextResponseTab(callbacks)); } }
响应编辑器标签实现(只读)
public class PlaintextResponseTab implements IResponseEditorTab { private final IBurpExtenderCallbacks callbacks; private final IExtensionHelpers helpers; private JTextArea textArea; public PlaintextResponseTab(IBurpExtenderCallbacks callbacks) { this.callbacks = callbacks; this.helpers = callbacks.getHelpers(); textArea = new JTextArea(); textArea.setFont(new Font(Font.MONOSPACED, Font.PLAIN, 12)); textArea.setEditable(false); // 设置为只读 } @Override public String getTabCaption() { return "明文响应"; } @Override public Component getUiComponent() { return new JScrollPane(textArea); } @Override public boolean isEnabled(byte[] content, boolean isRequest) { if (isRequest) return false; IResponseInfo respInfo = helpers.analyzeResponse(content); byte[] body = Arrays.copyOfRange(content, respInfo.getBodyOffset(), content.length); return new String(body).contains("<!-- obfuscated"); } @Override public void setResponse(byte[] content) { IResponseInfo respInfo = helpers.analyzeResponse(content); byte[] body = Arrays.copyOfRange(content, respInfo.getBodyOffset(), content.length); String obfuscatedContent = new String(body).replace("<!-- obfuscated", ""); byte[] plaintext = helpers.base64Decode(obfuscatedContent); textArea.setText(new String(plaintext)); } @Override public byte[] getModifiedResponse() { return null; // 不需要修改响应,返回null即可 } @Override public boolean isModified() { return false; } }
方案优势
- 完全隔离了“本地查看/修改明文”和“实际传输混淆数据”两个环节,不会干扰应用与服务器的正常通信
- 代理历史、Repeater、Intruder等所有Burp模块的编辑器都能使用这个明文标签
- 不需要修改全局HTTP处理逻辑,避免出现之前修改HTTP Handler导致应用无法处理响应的问题
内容的提问来源于stack exchange,提问作者upe
相关产品推荐
相关产品推荐

