<pre id="vvttv"><mark id="vvttv"><progress id="vvttv"></progress></mark></pre>
    <pre id="vvttv"></pre>

      <p id="vvttv"></p>

          <p id="vvttv"></p>

                <p id="vvttv"></p>

                <pre id="vvttv"><cite id="vvttv"><progress id="vvttv"></progress></cite></pre>

                  <output id="vvttv"><dfn id="vvttv"><th id="vvttv"></th></dfn></output>

                    <p id="vvttv"></p>

                    原文地址:http://drops.wooyun.org/tools/16056

                    此文接著 《BurpSuite插件開發指南之 API 下篇》 。在此篇中將會介紹如何使用Java 開發 BurpSuite 的插件,重點會介紹利用 Java 的 Swing 包開發帶有 GUI 的 Burp 插件。

                    《BurpSuite 插件開發指南》系列文章如下:

                    注:此系列文章是筆者利用業余時間所寫,如有錯誤,望讀者們及時指正,另外此系列文章屬于入門級別的科普文,目的是普及Burp插件的編寫技術。

                    0x00 Java 接口簡介


                    知其然更要知其所以然。在真正動手編寫 Burp 插件之前,有必要對Burp提供的各個接口有一定的了解,同時要有一定的編程經驗和能力。那么,在此篇中讀者則有必要了解 Java 的接口技術。

                    接口(英文:Interface)在 Java 編程語言中是一個比較抽象的東西。熟悉 OOP 的同學可以用“類”的思想來理解接口。但是,要明白的是,類與接口有相似的地方同時也有很多不同的地方。

                    接口的聲明

                    接口的聲明語法格式如下:

                    #!java
                    [可見度] interface 接口名稱 [extends 其他的類名] {
                            // 聲明變量
                            // 抽象方法
                    }
                    

                    例如,Burp 的 接口聲明原型如下:

                    #!java
                    package burp;
                    
                    public interface IBurpExtender
                    {
                        void registerExtenderCallbacks(IBurpExtenderCallbacks callbacks);
                    }
                    

                    接口的實現

                    一個接口可以被另外一個接口繼承,也可以被一個類實現。當類實現接口的時候,類要實現接口中所有的方法。否則,類必須聲明為抽象的類。類使用implements關鍵字實現接口。在類聲明中,Implements關鍵字放在class聲明后面。不熟悉Java編程的讀者要牢記這幾點。

                    實現一個接口的語法如下:

                    #!java
                    ... implements 接口名稱[, 其他接口1, 其他接口2..., ...] ...
                    

                    例如,編寫 Burp 插件必須編寫的 BurpExtender 類實現 IBurpExtender 和 IProxyListener 接口代碼如下:

                    #!java
                    package burp;
                    
                    public class BurpExtender implements IBurpExtender, IProxyListener{
                    
                        // 實現 IBurpExtender 接口的 registerExtenderCallbacks 方法
                        @Override
                        public void registerExtenderCallbacks(IBurpExtenderCallbacks callbacks) {
                            // TODO here
                        }
                    
                        // 實現 IProxyListener 接口的 processProxyMessage 方法
                        @Override
                        public void processProxyMessage(boolean messageIsRequest,
                                IInterceptedProxyMessage message) {
                            // TODO here
                        }
                    }
                    

                    需要注意的是,在Burp提供的接口文檔中,并不是所有的接口都可以用類實現,只有在接口的描述中說明了“該接口可以被實現”時,所對應的接口才可以被你所編寫的類實現其方法。

                    0x01 Java Swing 和 AWT 包簡介


                    Java Swing 是 Java Foundation Classes(JFC)的一部分。在 Swing 中,包含了很多強大靈活的,跨平臺的 GUI 控件。Swing 組件遵循(MVC)模型 - 視圖 - 控制器架構,并提供了三個通用的頂層容器類 JFrame,JDialog 和 JApplet。在開發帶有 GUI 的 BurpSuite 插件時,一般不會直接用到這三個頂層容器類,具體要看個人的設計和需求。

                    下面是一些最常用的控件:

                    Swing 是在 AWT 的基礎上構建的一套新的圖形界面系統,所以 AWT 是 Java 實現圖形界面的基礎,圖形控件的事件監聽和響應也是由 AWT 完成的。不過,編寫 Burp 插件所用到的圖形組件和事件并不多,很容易上手。

                    有關更多 GUI 組件的知識,請讀者自行百度了解。在此不做過多闡述。

                    0x02 自定義 Burp UI 標簽


                    編寫 GUI 的 Burp 插件在實際使用時更加易于操作和表達信息。當然,編寫起來也十分簡單,只需遵循一定的“套路”,就可以了。

                    最終編寫好的基本的樣式如下圖所示:

                    代碼如下:

                    #!java
                    /*
                     *  BurpSuite 插件開發指南之 Java 篇
                     *  writend by Her0in 
                     */
                    package burp;
                    
                    import java.awt.Component;
                    import java.awt.event.MouseAdapter;
                    import java.awt.event.MouseEvent;
                    import java.io.PrintWriter;
                    import javax.swing.JButton;
                    import javax.swing.JPanel;
                    import javax.swing.SwingUtilities;
                    
                    public class BurpExtender implements IBurpExtender, ITab{
                    
                        public PrintWriter stdout;
                        public IExtensionHelpers hps;
                        public IBurpExtenderCallbacks cbs;
                    
                        public JPanel jPanelMain;
                    
                        @Override
                        public void registerExtenderCallbacks(IBurpExtenderCallbacks callbacks)         {
                    
                            callbacks.setExtensionName("BurpExtender");
                    
                            this.hps = callbacks.getHelpers();
                            this.cbs = callbacks;
                            this.stdout = new PrintWriter(callbacks.getStdout(), true);
                    
                            this.stdout.println("hello burp!");
                    
                            SwingUtilities.invokeLater(new Runnable() {
                                @Override
                                public void run() {
                    
                                    jPanelMain = new JPanel();
                    
                                    JButton jButton = new JButton("老司機,快點我!");
                    
                                    jButton.addMouseListener(new MouseAdapter() {
                    
                                        @Override
                                        public void mouseClicked(MouseEvent e){
                                            stdout.println("嗶...");
                                        }
                    
                                    });
                    
                    
                                    // 將按鈕添加到 主面板 jPanelMain 中. 
                                    jPanelMain.add(jButton);
                    
                                    // 設置自定義組件并添加標簽
                                    cbs.customizeUiComponent(jPanelMain);
                                    cbs.addSuiteTab(BurpExtender.this);
                                }
                            });
                        }
                    
                        // 實現 ITab 接口的 getTabCaption 方法
                        @Override
                        public String getTabCaption() {
                            return "Burp 標簽測試";
                        }
                    
                        // 實現 ITab 接口的 getUiComponent 方法
                        @Override
                        public Component getUiComponent() {
                            return jPanelMain;
                        }
                    }
                    

                    從上述代碼中,讀者也能夠看到,Java 的 Swing 圖形編程有點蛋疼,需要一層層的編寫。首先需要添加一個 JPanel 上去,然后在這個 JPanel 中再添加圖形組件,如果還有上層的圖形組件,則需要再添加一個 Panel 類型的控件。

                    在這里有一個比較快速編寫 Burp GUI插件的方法,先利用 NetBeans IDE 將圖形界面拖拽式的寫好,然后將上述顯示控件的代碼替換為顯示這個 JFrame 的代碼。之后編寫相關的事件響應代碼。

                    0x03 BurpSuite插件開發實例之 JSON 水坑 檢測插件


                    本小節,筆者將會使用一個實例來“拋磚引玉”式的描述編寫帶有 GUI 的 Burp 插件。讀者可以把關注點放在圖形控件的放置順序和事件處理上,可以無視 JSON 水坑檢測的邏輯是否嚴謹以及誤報率,準確率是否科學等問題。

                    最終編寫好的插件如下圖:

                    頂部的控件是一個表格列表控件,會放置檢測到的結果。下面兩個 ITextEditor 分別顯示當前 HTTP 數據包的請求信息和響應信息。

                    代碼就直接貼出來吧,如下:

                    #!java
                    /*
                     *  BurpSuite 插件開發指南之 Java 篇
                     *  writend by Her0in 
                     */
                    package burp;
                    
                    import java.awt.BorderLayout;
                    import java.awt.Component;
                    import java.awt.Rectangle;
                    import java.awt.event.ComponentEvent;
                    import java.awt.event.ComponentListener;
                    import java.io.PrintWriter;
                    import java.util.Vector;
                    import javax.swing.JPanel;
                    import javax.swing.JScrollPane;
                    import javax.swing.JSplitPane;
                    import javax.swing.JTabbedPane;
                    import javax.swing.ScrollPaneConstants;
                    import javax.swing.SwingUtilities;
                    
                    public class BurpExtender implements IBurpExtender, ITab, IHttpListener{
                    
                        public PrintWriter stdout;
                        public IExtensionHelpers hps;
                        public IBurpExtenderCallbacks cbs;
                    
                        public IRequestInfo iRequestInfo;
                        public IResponseInfo iResponseInfo;
                    
                        public JPanel jPanel_top;
                        public JTabbedPane jTabbedPane; 
                        public JScrollPane jScrollPane;
                        public JSplitPane jSplitPaneV;
                    
                        // 自己封裝一個 Table 控件
                        private Her0inTable jsonTable;
                    
                        //請求,響應信息顯示
                        public JPanel jPanel_reqInfo_left;
                        public JPanel jPanel_respInfo_right;
                        public JSplitPane jSplitPaneInfo;
                        public ITextEditor iRequestTextEditor;
                        public ITextEditor iResponseTextEditor;
                    
                        Boolean bFind = false;
                        String strTags = "";
                    
                        @Override
                        public void registerExtenderCallbacks(IBurpExtenderCallbacks callbacks) {
                    
                            callbacks.setExtensionName("JSON 水坑檢測");
                    
                            this.hps = callbacks.getHelpers();
                            this.cbs = callbacks;
                            this.stdout = new PrintWriter(callbacks.getStdout(), true);
                    
                            this.stdout.println("hello burp!");
                    
                            SwingUtilities.invokeLater(new Runnable() {
                                @Override
                                public void run() {
                    
                                    // 初始化垂直分隔面板
                                    jSplitPaneV = new JSplitPane(JSplitPane.VERTICAL_SPLIT, true);
                                    jSplitPaneV.setDividerLocation(0.5);
                                    jSplitPaneV.setOneTouchExpandable(true);
                    
                                    // 垂直分隔面板的頂部
                                    jPanel_top = new JPanel();
                                    // 設置垂直分隔面板頂部的子控件
                                    // 放置表格控件
                                    jTabbedPane = new JTabbedPane();
                    
                                    // 初始化 Burp 提供的 ITextEditor 編輯器接口
                                    iRequestTextEditor = cbs.createTextEditor();
                                    iRequestTextEditor.setEditable(false);
                    
                                    iResponseTextEditor = cbs.createTextEditor();
                                    iResponseTextEditor.setEditable(false);
                    
                                    // 初始化 jsonTable
                                    jsonTable = new Her0inTable(iRequestTextEditor, iResponseTextEditor, stdout);
                    
                                    // 最好放置一個 JScrollPane
                                    JScrollPane jScrollPane1 = new JScrollPane(jsonTable.getTab());
                                    jScrollPane1.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
                                    jScrollPane1.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);
                    
                                    jTabbedPane.scrollRectToVisible(new Rectangle(500, 70));
                                    jTabbedPane.addTab("JSON 水坑檢測", jScrollPane1);
                    
                                    jScrollPane = new JScrollPane(jTabbedPane);
                                    jScrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
                                    jScrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);
                                    jPanel_top.add(jScrollPane, BorderLayout.CENTER);
                                    jPanel_top.setLayout(null);
                    
                                    // 添加componentResized事件 否則在改變Burp 主窗口大小時會錯位
                                    jPanel_top.addComponentListener(new ComponentListener() {
                    
                                        @Override
                                        public void componentShown(ComponentEvent e) {
                                        }
                    
                                        @Override
                                        public void componentResized(ComponentEvent e) {
                                                if(e.getSource() == jPanel_top){
                                                        jScrollPane.setSize(jPanel_top.getSize().width - 5,
                                                                        jPanel_top.getSize().height - 5);                           
                                                        jScrollPane.setSize(jPanel_top.getSize().width - 10,
                                                                        jPanel_top.getSize().height - 10);
                                                }
                                        }
                    
                                        @Override
                                        public void componentMoved(ComponentEvent e) {
                                                // TODO Auto-generated method stub
                                        }
                    
                                        @Override
                                        public void componentHidden(ComponentEvent e) {
                                                // TODO Auto-generated method stub  
                                        }
                                    });
                    
                                    // 設置垂直分隔面板底部的子控件
                    
                                    // 顯示請求/響應 信息的水平分隔面板初始化
                                    jSplitPaneInfo = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, true);
                                    jSplitPaneInfo.setDividerLocation(0.5);
                                    jSplitPaneInfo.setOneTouchExpandable(true); 
                    
                                    // 初始化 請求,響應信息顯示 面板                             
                                    jPanel_reqInfo_left = new JPanel();
                                    jPanel_respInfo_right = new JPanel();
                    
                                    jPanel_reqInfo_left.setLayout(new BorderLayout());
                                    jPanel_respInfo_right.setLayout(new BorderLayout());
                    
                                    // 將 Burp 提供的 ITextEditor 編輯器 添加到請求,響應信息顯示 面板中
                                    jPanel_reqInfo_left.add(iRequestTextEditor.getComponent(),
                                                    BorderLayout.CENTER);
                                    jPanel_respInfo_right.add(iResponseTextEditor.getComponent(),
                                                    BorderLayout.CENTER);
                    
                                    // 分別添加 請求,響應信息顯示 面板 到 垂直分隔面板底部
                                    jSplitPaneInfo.add(jPanel_reqInfo_left, JSplitPane.LEFT);
                                    jSplitPaneInfo.add(jPanel_respInfo_right, JSplitPane.RIGHT);
                    
                                    // 最后,為垂直分隔面板添加頂部面板和水平分隔面板
                                    jSplitPaneV.add(jPanel_top, JSplitPane.TOP);
                                    jSplitPaneV.add(jSplitPaneInfo, JSplitPane.BOTTOM);
                    
                                    // 設置自定義組件并添加標簽
                                    cbs.customizeUiComponent(jSplitPaneV);
                                    cbs.addSuiteTab(BurpExtender.this);
                                }
                            });
                    
                            callbacks.registerHttpListener(this);
                        }
                    
                        // 實現 ITab 接口的 getTabCaption 方法
                        @Override
                        public String getTabCaption() {
                            return "JSON 水坑檢測";
                        }
                    
                        // 實現 ITab 接口的 getUiComponent 方法
                        @Override
                        public Component getUiComponent() {
                            return jSplitPaneV;
                        }
                    
                    
                        public void CheckJson(IHttpRequestResponse messageInfo) {
                                try {
                                    this.iRequestInfo = this.hps.analyzeRequest(messageInfo);
                                    this.iResponseInfo = this.hps.analyzeResponse(messageInfo.getResponse());   
                                } catch (Exception e) {
                                    return ;
                                }
                    
                    //            stdout.println(messageInfo.getHttpService().getHost());
                    
                                this.bFind = false;
                                java.util.List<IParameter> listIParameters = iRequestInfo.getParameters();  
                                strTags = "";
                                for (IParameter param : listIParameters) {
                                        String strName = param.getName().toLowerCase();
                                        if(strName.indexOf("callback") != -1 || strName.indexOf("_callback") !=-1 ||
                                                        strName.indexOf("cb") !=-1 || strName.indexOf("_cb") != -1 ||
                                                        strName.indexOf("huidiao") !=-1 ){
                                                strTags += "# find => " + strName;
                                                this.bFind = true;
                                        }
                                }
                    
                    
                                if(this.bFind){
                                        Vector<String> vectorRow = new Vector<String>();
                                        vectorRow.addElement(new String(Integer.toString(jsonTable.defaultTableModel.getRowCount())));
                                        vectorRow.addElement(new String(this.iRequestInfo.getUrl().getHost()));
                                        vectorRow.addElement(new String(this.iRequestInfo.getMethod()));
                                        if(this.iRequestInfo.getUrl().getQuery() != null){
                                                vectorRow.addElement(new String(this.iRequestInfo.getUrl().getPath() + "?" + this.iRequestInfo.getUrl().getQuery()));
                                        }else{
                                                vectorRow.addElement(new String(this.iRequestInfo.getUrl().getPath()));
                                        }
                                        vectorRow.addElement(new String(strTags));
                                        jsonTable.defaultTableModel.addRow(vectorRow);
                                        jsonTable.iHttpList.add(messageInfo);
                                }
                        }
                    
                        @Override
                        public void processHttpMessage(int toolFlag, boolean messageIsRequest, IHttpRequestResponse messageInfo) {
                    
                            if (!messageIsRequest) {
                                //JSON 檢測
                                this.CheckJson(messageInfo);
                            }
                        }
                    }
                    

                      <pre id="vvttv"><mark id="vvttv"><progress id="vvttv"></progress></mark></pre>
                      <pre id="vvttv"></pre>

                        <p id="vvttv"></p>

                            <p id="vvttv"></p>

                                  <p id="vvttv"></p>

                                  <pre id="vvttv"><cite id="vvttv"><progress id="vvttv"></progress></cite></pre>

                                    <output id="vvttv"><dfn id="vvttv"><th id="vvttv"></th></dfn></output>

                                      <p id="vvttv"></p>

                                      这里只有精品视频