├── .gitignore ├── README.md ├── imgs ├── 2021-04-01-44536.png └── image-20210401145354476.png ├── pom.xml └── src └── main └── java └── burp ├── BurpExtender.java ├── Config.java ├── ConfigDlg.java ├── Menu.java └── Transfer.java /.gitignore: -------------------------------------------------------------------------------- 1 | # Compiled class file 2 | *.class 3 | 4 | # Log file 5 | *.log 6 | 7 | # BlueJ files 8 | *.ctxt 9 | 10 | # Mobile Tools for Java (J2ME) 11 | .mtj.tmp/ 12 | 13 | # Package Files # 14 | *.jar 15 | *.war 16 | *.nar 17 | *.ear 18 | *.zip 19 | *.tar.gz 20 | *.rar 21 | 22 | # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml 23 | hs_err_pid* 24 | 25 | /target/ 26 | /.idea/ 27 | 28 | /*.iml -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## burpsuite POST数据包base64编码插件 2 | 3 | **适用场景:** 4 | 5 | 使用burp作为代理,经过burp的数据包会自动进行base64编码(仅限POST包)。 6 | 7 | **使用方法:** 8 | 9 | 使用mavn进行编译后加载到burp的Extensions中使用,或者直接在右侧Release中下载编译好的jar包加载使用。 10 | 11 | 编译方法 12 | 13 | ```txt 14 | mvn package 15 | ``` 16 | 17 | **插件截图** 18 | 19 | ![2021-04-01-144536](imgs/2021-04-01-44536.png) 20 | 21 | ![image-20210401145354476](imgs/image-20210401145354476.png) 22 | 23 | 24 | 25 | **后期计划:** 26 | 27 | - 增加更多编码功能,例如URL编码,unicode编码等。 28 | 29 | - 增加加密功能:例如md5,AES等。 30 | 31 | ## 感谢 32 | 33 | 本插件的思路和外观借用了[chunked-coding-converter](https://github.com/c0ny1/chunked-coding-converter)插件,这是一款很优秀的插件,向它的作者c0ny1学习。 34 | -------------------------------------------------------------------------------- /imgs/2021-04-01-44536.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/handbye/base64encode/525b059eca6cb018addc6ee153cf46190debc50b/imgs/2021-04-01-44536.png -------------------------------------------------------------------------------- /imgs/image-20210401145354476.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/handbye/base64encode/525b059eca6cb018addc6ee153cf46190debc50b/imgs/image-20210401145354476.png -------------------------------------------------------------------------------- /pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 4.0.0 6 | 7 | cn.darkless 8 | base64encode 9 | 1.0 10 | 11 | base64encode 12 | 13 | http://www.example.com 14 | 15 | 16 | UTF-8 17 | 1.7 18 | 1.7 19 | 20 | 21 | 22 | 23 | 24 | net.portswigger.burp.extender 25 | burp-extender-api 26 | 2.1 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | maven-clean-plugin 36 | 3.1.0 37 | 38 | 39 | 40 | maven-resources-plugin 41 | 3.0.2 42 | 43 | 44 | maven-compiler-plugin 45 | 3.8.0 46 | 47 | 48 | maven-surefire-plugin 49 | 2.22.1 50 | 51 | 52 | maven-jar-plugin 53 | 3.0.2 54 | 55 | 56 | 57 | burp.BurpExtender> 58 | 59 | 60 | 61 | 62 | 63 | maven-install-plugin 64 | 2.5.2 65 | 66 | 67 | maven-deploy-plugin 68 | 2.8.2 69 | 70 | 71 | 72 | maven-site-plugin 73 | 3.7.1 74 | 75 | 76 | maven-project-info-reports-plugin 77 | 3.0.0 78 | 79 | 80 | 81 | 82 | 83 | -------------------------------------------------------------------------------- /src/main/java/burp/BurpExtender.java: -------------------------------------------------------------------------------- 1 | package burp; 2 | 3 | import java.io.PrintWriter; 4 | 5 | public class BurpExtender implements IBurpExtender, IHttpListener, IProxyListener { 6 | public static IBurpExtenderCallbacks callbacks; 7 | public static IExtensionHelpers helpers; 8 | private String extensionName = "base64Encoding"; 9 | private String version ="1.0"; 10 | public static PrintWriter stdout; 11 | public static PrintWriter stderr; 12 | 13 | @Override 14 | public void registerExtenderCallbacks(IBurpExtenderCallbacks callbacks) { 15 | this.callbacks = callbacks; 16 | this.helpers = callbacks.getHelpers(); 17 | callbacks.setExtensionName(String.format("%s %s",extensionName,version)); 18 | callbacks.registerContextMenuFactory(new Menu()); 19 | callbacks.registerHttpListener(this); 20 | callbacks.registerProxyListener(this); 21 | stdout = new PrintWriter(callbacks.getStdout(),true); 22 | stderr = new PrintWriter(callbacks.getStderr(),true); 23 | stdout.println(getBanner()); 24 | } 25 | 26 | 27 | @Override 28 | public void processHttpMessage(int toolFlag, boolean messageIsRequest, IHttpRequestResponse messageInfo) { 29 | // 处理除代理套件之外的套件流量 30 | if(messageIsRequest && isValidTool(toolFlag) && (toolFlag != IBurpExtenderCallbacks.TOOL_PROXY)){ 31 | IRequestInfo reqInfo = helpers.analyzeRequest(messageInfo.getRequest()); 32 | 33 | if(reqInfo.getMethod().equals("POST")){ 34 | try { 35 | byte[] request = Transfer.encoding(messageInfo); 36 | if (request != null) { 37 | messageInfo.setRequest(request); 38 | } 39 | } catch (Exception e) { 40 | e.printStackTrace(stderr); 41 | } 42 | } 43 | } 44 | } 45 | 46 | 47 | @Override 48 | public void processProxyMessage(final boolean messageIsRequest, final IInterceptedProxyMessage proxyMessage) { 49 | // 处理代理套件流量 50 | if(messageIsRequest && isValidTool(IBurpExtenderCallbacks.TOOL_PROXY)){ 51 | IHttpRequestResponse messageInfo = proxyMessage.getMessageInfo(); 52 | IRequestInfo reqInfo = helpers.analyzeRequest(messageInfo.getRequest()); 53 | 54 | if(reqInfo.getMethod().equals("POST")){ 55 | try { 56 | byte[] request = Transfer.encoding(messageInfo); 57 | if (request != null) { 58 | messageInfo.setRequest(request); 59 | } 60 | } catch (Exception e) { 61 | e.printStackTrace(stderr); 62 | } 63 | } 64 | } 65 | } 66 | 67 | /** 68 | * 插件是否作用于该套件 69 | * @param toolFlag 70 | * @return 71 | */ 72 | private boolean isValidTool(int toolFlag){ 73 | return (Config.isAct_on_all_tools() || 74 | (Config.isAct_on_proxy() && toolFlag== IBurpExtenderCallbacks.TOOL_PROXY) || 75 | (Config.isAct_on_intruder() && toolFlag== IBurpExtenderCallbacks.TOOL_INTRUDER) || 76 | (Config.isAct_on_repeater() && toolFlag== IBurpExtenderCallbacks.TOOL_REPEATER) || 77 | (Config.isAct_on_scanner() && toolFlag== IBurpExtenderCallbacks.TOOL_SCANNER) || 78 | (Config.isAct_on_sequencer() && toolFlag== IBurpExtenderCallbacks.TOOL_SEQUENCER) || 79 | (Config.isAct_on_spider() && toolFlag== IBurpExtenderCallbacks.TOOL_SPIDER) || 80 | (Config.isAct_on_extender() && toolFlag== IBurpExtenderCallbacks.TOOL_EXTENDER) || 81 | (Config.isAct_on_target() && toolFlag== IBurpExtenderCallbacks.TOOL_TARGET)); 82 | } 83 | 84 | 85 | /** 86 | * 插件Banner信息 87 | * @return 88 | */ 89 | public String getBanner(){ 90 | String bannerInfo = 91 | "[+]\n" 92 | + "[+] ##############################################\n" 93 | + "[+] " + extensionName + " v" + version +"\n" 94 | + "[+] anthor: darkless" 95 | + "[+] blog: https://darkless.cn\n" 96 | + "[+] ##############################################"; 97 | return bannerInfo; 98 | } 99 | } -------------------------------------------------------------------------------- /src/main/java/burp/Config.java: -------------------------------------------------------------------------------- 1 | package burp; 2 | 3 | /** 4 | * 配置对象类,负责对配置项进行设置与获取 5 | */ 6 | public class Config { 7 | private static boolean act_on_all_tools = false; 8 | private static boolean act_on_target = false; 9 | private static boolean act_on_proxy = false; 10 | private static boolean act_on_spider = false; 11 | private static boolean act_on_intruder = false; 12 | private static boolean act_on_repeater = false; 13 | private static boolean act_on_scanner = false; 14 | private static boolean act_on_extender = false; 15 | private static boolean act_on_sequencer = false; 16 | 17 | 18 | public static boolean isAct_on_all_tools() { 19 | String val = BurpExtender.callbacks.loadExtensionSetting("act_on_all_tools"); 20 | if(val == null) return Config.act_on_all_tools; 21 | try { 22 | return Boolean.valueOf(val); 23 | }catch(Exception e){ 24 | return Config.act_on_all_tools; 25 | } 26 | } 27 | 28 | public static void setAct_on_all_tools(boolean act_on_all_tools) { 29 | BurpExtender.callbacks.saveExtensionSetting("act_on_all_tools", String.valueOf(act_on_all_tools)); 30 | Config.act_on_all_tools = act_on_all_tools; 31 | } 32 | 33 | public static boolean isAct_on_target() { 34 | String val = BurpExtender.callbacks.loadExtensionSetting("act_on_target"); 35 | if(val == null) return Config.act_on_target; 36 | try { 37 | return Boolean.valueOf(val); 38 | }catch(Exception e){ 39 | return Config.act_on_target; 40 | } 41 | } 42 | 43 | public static void setAct_on_target(boolean act_on_target) { 44 | BurpExtender.callbacks.saveExtensionSetting("act_on_target", String.valueOf(act_on_target)); 45 | Config.act_on_target = act_on_target; 46 | } 47 | 48 | public static boolean isAct_on_proxy() { 49 | String val = BurpExtender.callbacks.loadExtensionSetting("act_on_proxy"); 50 | if(val == null) return Config.act_on_proxy; 51 | try { 52 | return Boolean.valueOf(val); 53 | }catch(Exception e){ 54 | return Config.act_on_proxy; 55 | } 56 | } 57 | 58 | public static void setAct_on_proxy(boolean act_on_proxy) { 59 | BurpExtender.callbacks.saveExtensionSetting("act_on_proxy", String.valueOf(act_on_proxy)); 60 | Config.act_on_proxy = act_on_proxy; 61 | } 62 | 63 | public static boolean isAct_on_spider() { 64 | String val = BurpExtender.callbacks.loadExtensionSetting("act_on_spider"); 65 | if(val == null) return Config.act_on_spider; 66 | try { 67 | return Boolean.valueOf(val); 68 | }catch(Exception e){ 69 | return Config.act_on_spider; 70 | } 71 | } 72 | 73 | public static void setAct_on_spider(boolean act_on_spider) { 74 | BurpExtender.callbacks.saveExtensionSetting("act_on_spider", String.valueOf(act_on_spider)); 75 | Config.act_on_spider = act_on_spider; 76 | } 77 | 78 | public static boolean isAct_on_intruder() { 79 | String val = BurpExtender.callbacks.loadExtensionSetting("act_on_intruder"); 80 | if(val == null) return Config.act_on_intruder; 81 | try { 82 | return Boolean.valueOf(val); 83 | }catch(Exception e){ 84 | return Config.act_on_intruder; 85 | } 86 | } 87 | 88 | public static void setAct_on_intruder(boolean act_on_intruder) { 89 | BurpExtender.callbacks.saveExtensionSetting("act_on_intruder", String.valueOf(act_on_intruder)); 90 | Config.act_on_intruder = act_on_intruder; 91 | } 92 | 93 | public static boolean isAct_on_repeater() { 94 | String val = BurpExtender.callbacks.loadExtensionSetting("act_on_repeater"); 95 | if(val == null) return Config.act_on_repeater; 96 | try { 97 | return Boolean.valueOf(val); 98 | }catch(Exception e){ 99 | return Config.act_on_repeater; 100 | } 101 | } 102 | 103 | public static void setAct_on_repeater(boolean act_on_repeater) { 104 | BurpExtender.callbacks.saveExtensionSetting("act_on_repeater", String.valueOf(act_on_repeater)); 105 | Config.act_on_repeater = act_on_repeater; 106 | } 107 | 108 | public static boolean isAct_on_scanner() { 109 | String val = BurpExtender.callbacks.loadExtensionSetting("act_on_scanner"); 110 | if(val == null) return Config.act_on_scanner; 111 | try { 112 | return Boolean.valueOf(val); 113 | }catch(Exception e){ 114 | return Config.act_on_scanner; 115 | } 116 | } 117 | 118 | public static void setAct_on_scanner(boolean act_on_scanner) { 119 | BurpExtender.callbacks.saveExtensionSetting("act_on_scanner", String.valueOf(act_on_scanner)); 120 | Config.act_on_scanner = act_on_scanner; 121 | } 122 | 123 | public static boolean isAct_on_extender() { 124 | String val = BurpExtender.callbacks.loadExtensionSetting("act_on_extender"); 125 | if(val == null) return Config.act_on_extender; 126 | try { 127 | return Boolean.valueOf(val); 128 | }catch(Exception e){ 129 | return Config.act_on_extender; 130 | } 131 | } 132 | 133 | public static void setAct_on_extender(boolean act_on_extender) { 134 | BurpExtender.callbacks.saveExtensionSetting("act_on_extender", String.valueOf(act_on_extender)); 135 | Config.act_on_extender = act_on_extender; 136 | } 137 | 138 | public static boolean isAct_on_sequencer() { 139 | String val = BurpExtender.callbacks.loadExtensionSetting("act_on_sequencer"); 140 | if(val == null) return Config.act_on_sequencer; 141 | try { 142 | return Boolean.valueOf(val); 143 | }catch(Exception e){ 144 | return Config.act_on_sequencer; 145 | } 146 | } 147 | 148 | public static void setAct_on_sequencer(boolean act_on_sequencer) { 149 | BurpExtender.callbacks.saveExtensionSetting("act_on_sequencer", String.valueOf(act_on_sequencer)); 150 | Config.act_on_sequencer = act_on_sequencer; 151 | } 152 | } -------------------------------------------------------------------------------- /src/main/java/burp/ConfigDlg.java: -------------------------------------------------------------------------------- 1 | package burp; 2 | 3 | import javax.swing.*; 4 | import java.awt.*; 5 | import java.awt.event.ActionEvent; 6 | import java.awt.event.ActionListener; 7 | 8 | /** 9 | * 配置窗口类,负责显示配置窗口,处理窗口消息 10 | */ 11 | public class ConfigDlg extends JDialog { 12 | private final JPanel mainPanel = new JPanel(); 13 | private final JPanel topPanel = new JPanel(); 14 | private final JPanel centerPanel = new JPanel(); 15 | private final JPanel bottomPanel = new JPanel();; 16 | private final JLabel lbActOnModel = new JLabel("Act on:"); 17 | private final JCheckBox chkAllTools = new JCheckBox("All Tools"); 18 | private final JCheckBox chkSpider = new JCheckBox("Spider"); 19 | private final JCheckBox chkIntruder = new JCheckBox("Intruder"); 20 | private final JCheckBox chkScanner = new JCheckBox("Scanner"); 21 | private final JCheckBox chkRepeater = new JCheckBox("Repeater"); 22 | private final JCheckBox chkSequencer = new JCheckBox("Sequencer"); 23 | private final JCheckBox chkProxy = new JCheckBox("Proxy"); 24 | private final JCheckBox chkExtender = new JCheckBox("Extender"); 25 | private final JCheckBox chkTarget = new JCheckBox("Target"); 26 | private final JButton btSave = new JButton("Save"); 27 | private final JButton btCancel = new JButton("Cancel"); 28 | 29 | 30 | public ConfigDlg(){ 31 | initGUI(); 32 | initEvent(); 33 | initValue(); 34 | this.setTitle("encoding config"); 35 | } 36 | 37 | 38 | /** 39 | * 初始化UI 40 | */ 41 | private void initGUI(){ 42 | topPanel.setLayout(new FlowLayout(FlowLayout.LEFT)); 43 | centerPanel.setLayout(new FlowLayout(FlowLayout.LEFT)); 44 | centerPanel.add(lbActOnModel); 45 | centerPanel.add(chkAllTools); 46 | centerPanel.add(chkTarget); 47 | centerPanel.add(chkProxy); 48 | centerPanel.add(chkSpider); 49 | centerPanel.add(chkIntruder); 50 | centerPanel.add(chkRepeater); 51 | centerPanel.add(chkScanner); 52 | centerPanel.add(chkSequencer); 53 | centerPanel.add(chkExtender); 54 | 55 | bottomPanel.setLayout(new FlowLayout(FlowLayout.CENTER)); 56 | bottomPanel.add(btSave); 57 | bottomPanel.add(btCancel); 58 | 59 | mainPanel.setLayout(new BorderLayout()); 60 | mainPanel.add(topPanel,BorderLayout.NORTH); 61 | mainPanel.add(centerPanel,BorderLayout.CENTER); 62 | mainPanel.add(bottomPanel,BorderLayout.SOUTH); 63 | 64 | this.setModal(true); 65 | this.setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); 66 | this.add(mainPanel); 67 | //使配置窗口自动适应控件大小,防止部分控件无法显示 68 | this.pack(); 69 | //居中显示配置窗口 70 | Dimension screensize=Toolkit.getDefaultToolkit().getScreenSize(); 71 | this.setBounds(screensize.width/2-this.getWidth()/2,screensize.height/2-this.getHeight()/2,this.getWidth(),this.getHeight()); 72 | } 73 | 74 | 75 | /** 76 | * 初始化事件 77 | */ 78 | private void initEvent(){ 79 | chkAllTools.addActionListener(new ActionListener() { 80 | @Override 81 | public void actionPerformed(ActionEvent e) { 82 | if(chkAllTools.isSelected()){ 83 | chkTarget.setSelected(true); 84 | chkProxy.setSelected(true); 85 | chkSpider.setSelected(true); 86 | chkIntruder.setSelected(true); 87 | chkRepeater.setSelected(true); 88 | chkScanner.setSelected(true); 89 | chkExtender.setSelected(true); 90 | }else{ 91 | chkTarget.setSelected(false); 92 | chkProxy.setSelected(false); 93 | chkSpider.setSelected(false); 94 | chkIntruder.setSelected(false); 95 | chkRepeater.setSelected(false); 96 | chkScanner.setSelected(false); 97 | chkExtender.setSelected(false); 98 | } 99 | 100 | } 101 | }); 102 | 103 | btCancel.addActionListener(new ActionListener() { 104 | @Override 105 | public void actionPerformed(ActionEvent e) { 106 | ConfigDlg.this.dispose(); 107 | } 108 | }); 109 | 110 | btSave.addActionListener(new ActionListener() { 111 | @Override 112 | public void actionPerformed(ActionEvent e) { 113 | Config.setAct_on_all_tools(chkAllTools.isSelected()); 114 | Config.setAct_on_target(chkTarget.isSelected()); 115 | Config.setAct_on_proxy(chkProxy.isSelected()); 116 | Config.setAct_on_spider(chkSpider.isSelected()); 117 | Config.setAct_on_intruder(chkIntruder.isSelected()); 118 | Config.setAct_on_repeater(chkRepeater.isSelected()); 119 | Config.setAct_on_scanner(chkScanner.isSelected()); 120 | Config.setAct_on_sequencer(chkSequencer.isSelected()); 121 | Config.setAct_on_extender(chkExtender.isSelected()); 122 | ConfigDlg.this.dispose(); 123 | } 124 | }); 125 | } 126 | 127 | 128 | /** 129 | * 为控件赋值 130 | */ 131 | public void initValue(){ 132 | chkAllTools.setSelected(Config.isAct_on_all_tools()); 133 | chkTarget.setSelected(Config.isAct_on_target()); 134 | chkProxy.setSelected(Config.isAct_on_proxy()); 135 | chkSpider.setSelected(Config.isAct_on_spider()); 136 | chkIntruder.setSelected(Config.isAct_on_intruder()); 137 | chkRepeater.setSelected(Config.isAct_on_repeater()); 138 | chkScanner.setSelected(Config.isAct_on_scanner()); 139 | chkSequencer.setSelected(Config.isAct_on_sequencer()); 140 | chkExtender.setSelected(Config.isAct_on_extender()); 141 | } 142 | } -------------------------------------------------------------------------------- /src/main/java/burp/Menu.java: -------------------------------------------------------------------------------- 1 | package burp; 2 | 3 | import javax.swing.*; 4 | import java.awt.event.ActionEvent; 5 | import java.awt.event.ActionListener; 6 | import java.util.ArrayList; 7 | import java.util.List; 8 | 9 | /** 10 | * 菜单类,负责显示菜单,处理菜单事件 11 | */ 12 | public class Menu implements IContextMenuFactory { 13 | public List createMenuItems(final IContextMenuInvocation invocation) { 14 | List menus = new ArrayList(); 15 | JMenu encodeMenu = new JMenu("base64encode"); 16 | JMenuItem encode = new JMenuItem("Encoding request body"); 17 | JMenuItem decode = new JMenuItem("Decoding request body"); 18 | JMenuItem config = new JMenuItem("Config"); 19 | encodeMenu.add(encode); 20 | encodeMenu.add(decode); 21 | encodeMenu.addSeparator(); 22 | encodeMenu.add(config); 23 | 24 | //若数据包无法编辑,则将编码解码菜单项设置为禁用 25 | if(invocation.getInvocationContext() != IContextMenuInvocation.CONTEXT_MESSAGE_EDITOR_REQUEST){ 26 | encode.setEnabled(false); 27 | decode.setEnabled(false); 28 | } 29 | 30 | encode.addActionListener(new ActionListener(){ 31 | 32 | public void actionPerformed(ActionEvent arg0) { 33 | IHttpRequestResponse iReqResp = invocation.getSelectedMessages()[0]; 34 | IRequestInfo reqInfo = BurpExtender.helpers.analyzeRequest(iReqResp.getRequest()); 35 | // 不对GET请求进行编码 36 | if(!reqInfo.getMethod().equals("POST")){ 37 | JOptionPane.showConfirmDialog(null,"GET requests cannot be encoded!","Warning",JOptionPane.CLOSED_OPTION,JOptionPane.WARNING_MESSAGE); 38 | return; 39 | } 40 | 41 | try { 42 | byte[] request = Transfer.encoding(iReqResp); 43 | if (request != null) { 44 | iReqResp.setRequest(request); 45 | } 46 | } catch (Exception e) { 47 | BurpExtender.stderr.println(e.getMessage()); 48 | } 49 | } 50 | }); 51 | 52 | decode.addActionListener(new ActionListener(){ 53 | 54 | public void actionPerformed(ActionEvent arg0) { 55 | IHttpRequestResponse iReqResp = invocation.getSelectedMessages()[0]; 56 | 57 | try { 58 | byte[] request = Transfer.decoding(iReqResp); 59 | if (request != null) { 60 | iReqResp.setRequest(request); 61 | } 62 | } catch (Exception e) { 63 | BurpExtender.stderr.println(e.getMessage()); 64 | } 65 | } 66 | }); 67 | 68 | config.addActionListener(new ActionListener(){ 69 | 70 | public void actionPerformed(ActionEvent arg0) { 71 | try { 72 | ConfigDlg dlg = new ConfigDlg(); 73 | BurpExtender.callbacks.customizeUiComponent(dlg); 74 | dlg.setVisible(true); 75 | }catch (Exception e){ 76 | e.printStackTrace(BurpExtender.stderr); 77 | } 78 | } 79 | }); 80 | 81 | menus.add(encodeMenu); 82 | return menus; 83 | } 84 | } -------------------------------------------------------------------------------- /src/main/java/burp/Transfer.java: -------------------------------------------------------------------------------- 1 | package burp; 2 | 3 | import java.io.UnsupportedEncodingException; 4 | import java.util.*; 5 | 6 | /** 7 | * 编码解码类,负责对目标请求进行编码解码 8 | */ 9 | public class Transfer { 10 | /** 11 | * 对请求包进行base64编码 12 | * @return 13 | */ 14 | public static byte[] encoding(IHttpRequestResponse requestResponse) throws UnsupportedEncodingException { 15 | byte[] request = requestResponse.getRequest(); 16 | IRequestInfo requestInfo = BurpExtender.helpers.analyzeRequest(request); 17 | int bodyOffset = requestInfo.getBodyOffset(); 18 | int body_length = request.length - bodyOffset; 19 | String body = new String(request, bodyOffset, body_length, "UTF-8"); 20 | if (request.length - bodyOffset > 10000){ 21 | return request; 22 | } 23 | List headers = BurpExtender.helpers.analyzeRequest(request).getHeaders(); 24 | String decoding_body = BurpExtender.helpers.base64Encode(body); 25 | return BurpExtender.helpers.buildHttpMessage(headers, decoding_body.getBytes()); 26 | } 27 | 28 | 29 | /** 30 | * 对编码过的请求包进行解码 31 | * 32 | * @param requestResponse 已编码过的请求响应对象 33 | * @return 解码后的请求包 34 | * @throws UnsupportedEncodingException 35 | */ 36 | public static byte[] decoding(IHttpRequestResponse requestResponse) throws UnsupportedEncodingException { 37 | byte[] request = requestResponse.getRequest(); 38 | IRequestInfo requestInfo = BurpExtender.helpers.analyzeRequest(request); 39 | int body_offset = requestInfo.getBodyOffset(); 40 | String requestString = new String(request); 41 | String body = requestString.substring(body_offset); 42 | byte[] bodyBytes = body.getBytes(); 43 | List headers = BurpExtender.helpers.analyzeRequest(request).getHeaders(); 44 | //Decoding 45 | byte[] decoding_body = BurpExtender.helpers.base64Decode(bodyBytes); 46 | return BurpExtender.helpers.buildHttpMessage(headers, decoding_body); 47 | } 48 | 49 | } --------------------------------------------------------------------------------