You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 00:03:11