BurpSuite外掛開發指南之 API 上篇

wyzsk發表於2020-08-19
作者: Her0in · 2016/03/28 10:25

0x00 前言


BurpSuite 作為一款 Web 安全測試的利器,得益於其強大的代理,操控資料的功能,在 Web 安全測試過程中,為我們省下了不少時間和精力專注於漏洞的挖掘和測試。更重要的是 BurpSuite 提供了外掛開發介面,Web 安全測試人員可以根據實際需求自己開發出提高安全測試效率的外掛,雖然 BApp Store 上面已經提供了很多外掛,其中也不乏優秀好用的外掛,但是作為一名專業的 Web 安全測試人員,有必要熟練掌握 BurpSuite 外掛開發技術。
國內針對 BurpSuite 外掛開發的技術文件並不是很多,也不夠全面,《BurpSuite 外掛開發指南》系列文章作為 BurpSuite 非官方非權威開發指南,希望在這塊填補一些空白。文章中難免有紕漏,望讀者自行驗證並及時指出。

《BurpSuite 外掛開發指南》系列文章如下:

  • 《BurpSuite外掛開發指南之 API 篇》
  • 《BurpSuite外掛開發指南之 Java 篇》
  • 《BurpSuite外掛開發指南之 Python 篇》

在第一篇文章中,筆者將會介紹 BurpSuite 所提供的開發介面的功能和引數說明,但是不會對 BurpSuite 本身所提供的功能作太多說明。剩餘兩篇則會分別使用案例闡述 Java 和 Python 進行外掛開發的技術。其中會用到 Java 的 Swing 包進行 GUI 程式設計。

0x01 BurpSuite 外掛開發說明


BurpSuite 外掛擴充套件開發所支援的程式語言有 Java 和 Python,使用這兩種開發語言開發的外掛在功能上並沒有太多區別,使用原生的 Java 開發的外掛要比 Python 開發的外掛,載入和執行效率更高。所以,筆者推薦使用 Java 作為外掛開發的首選語言。

SDK:

  • 開發文件: BurpSuite 外掛開發文件線上地址:BurpSuite Extension Dev Doc 或者可以在 BurpSuite 程式的 “Extender” 標籤下的 “APIs” 子標籤裡找到。
  • SDK 包: 目前,BurpSuite 官網已經不再提供 SDK 包檔案的下載,讀者可以從 BurpSuite 程式中匯出。
  • JPython:使用 Python 開發外掛,需要先安裝 JPython

注:匯出 SDK 包檔案操作步驟:“Extender — APIs - Save interface files(左下角)”

開發 IDE:

  • 使用 Java 開發外掛的讀者可以使用 Eclipse 這款強大的 IDE 。當然也可以使用其他 Java 開發 IDE,如 IDEA。
  • 使用 Python 開發外掛的讀者也可以使用 Eclipse (需要安裝 PyDev 外掛)作為外掛開發的 IDE,或者使用 Notepad++, PyCharm。

注:推薦使用 Eclipse 作為外掛開發 IDE, 除了 Java 之外,Eclipse 對 JPython 也有很好的支援。

輔助工具:

  • Swing Inspector 是一個 Java Swing/AWT 使用者介面分析、除錯工具。可以快速除錯,定位問題,提高開發效率。

學習資料:
BurpSuite 官方並未提供詳細的開發文件,只有少量的開發例項,可以在此找到。不過,BurpSuite 官方建立了外掛開發者社群部落格,可以幫助開發者解答疑問。

在 烏雲Drops 上也有兩篇專門介紹 BurpSuite 外掛開發的文章,讀者可以參考:

相較於閱讀許多參考資料從零開始編寫外掛,筆者更推薦在熟悉了開發文件後直接在已有的原始碼中“照貓畫虎”進行外掛的開發。現有的外掛,讀者可以在 BApp Store 中找到,Python 版本的外掛可以直接檢視原始碼進行學習,Java 版本的外掛可以在反編譯後檢視其原始碼進行學習。

注:安裝了 BApp Store 中的外掛後,會在 BurpSuite 所在目錄下的 bapps 資料夾中找到外掛檔案。

外掛開發“方法論”:
外掛型的應用程式在設計時就一定會考慮外掛的開發,因此,主程式與外掛之間必然有一種“約定”,在開發外掛的過程中,只需按照程式開發者設計的這種“約定”開發就好了,讀者在閱讀參考官方開發文件時只需注意以下三點:

  • 介面方法功能
  • 介面方法入參(引數型別和引數個數)
  • 介面方法的返回值(返回值型別)

在關注上述三點以後,就可以把多個介面方法聯絡在一起,組織起一定的邏輯,這樣,開發的思路就順理成章了。

0x02 API 參考


本節將對 BurpSuite 的官方文件做簡要的說明,並給出簡單的 Demo code,各個介面具體的使用例項,可以在筆者後續的兩篇文章中看到。

IBurpExtender 介面

public interface IBurpExtender

所有的擴充套件必須實現此介面,實現的類名必須為“BurpExtender”。在 burp 包中,必須申明為 public ,並且必須提供一個預設的構造器。
此介面實現了以下方法:

#!java
void registerExtenderCallbacks(IBurpExtenderCallbacks callbacks)

此方法將在擴充套件載入後被呼叫,它註冊了一個 IBurpExtenderCallbacks 介面的例項,IBurpExtenderCallbacks 介面提供了許多在開發外掛過程中常用的一些操作。

引數說明:

  • callbacks 是一個 IBurpExtenderCallbacks 物件。

Demo code:

#!java
package burp;
public class BurpExtender implements IBurpExtender{
    @Override
    public void registerExtenderCallbacks(final IBurpExtenderCallbacks callbacks){
        // TODO here
    }
}

IBurpExtenderCallbacks

public interface IBurpExtenderCallbacks

此介面中實現的方法和欄位在外掛開發過程中會經常使用到。 Burp Suite 利用此介面向擴充套件中傳遞了許多回撥方法,這些回撥方法可被用於在 Burp 中執行多個操作。當擴充套件被載入後,Burp 會呼叫 registerExtenderCallbacks() 方法,並傳遞一個 IBurpExtenderCallbacks 的例項。擴充套件外掛可以透過這個例項呼叫很多擴充套件 Burp 功能必需的方法。如:設定擴充套件外掛的屬性,操作 HTTP 請求和響應以及啟動其他掃描功能等等。

此介面提供了很多的方法和欄位,在此不一一列舉,具體的說明可以在 burp SDK 中的 IBurpExtenderCallbacks.javahttps://portswigger.net/burp/extender/api/burp/IBurpExtenderCallbacks.html 中檢視。

Demo code:

#!java
package burp;
public class BurpExtender implements IBurpExtender{
    @Override
    public void registerExtenderCallbacks(final IBurpExtenderCallbacks callbacks){
        callbacks.setExtensionName("Her0in"); //設定副檔名稱為 “Her0in”
    }
}

IContextMenuFactory

public interface IContextMenuFactory

Burp 的作者在設計上下文選單功能中採用了工廠模式的設計模式,擴充套件可以實現此介面,然後呼叫 IBurpExtenderCallbacks.registerContextMenuFactory() 註冊自定義上下文選單項的工廠。

此介面提供瞭如下方法:

#!java
java.util.List<javax.swing.JMenuItem>   createMenuItems(IContextMenuInvocation invocation)

當使用者在 Burp 中的任何地方呼叫一個上下文選單時,Burp 則會呼叫這個工廠方法。此方法會根據選單呼叫的細節,提供應該被顯示在上下文選單中的任何自定義上下文選單項。

引數說明:

  • invocation - 一個實現 IMessageEditorTabFactory 介面的物件, 透過此物件可以獲取上下文選單呼叫的細節。

返回值:
此工廠方法將會返回需要被顯示的自定義選單項的一個列表(包含子選單,checkbox 選單項等等), 若無選單項顯示,此工廠方法會返回 null

Demo code:

#!java
package burp;

import java.util.ArrayList;
import java.util.List;

import javax.swing.JMenu;
import javax.swing.JMenuItem;

public class BurpExtender implements IBurpExtender, IContextMenuFactory{

    @Override
    public void registerExtenderCallbacks(final IBurpExtenderCallbacks callbacks){

        callbacks.setExtensionName("Her0in");
        callbacks.registerContextMenuFactory(this);
    }


    @Override
    public List<JMenuItem> createMenuItems(final IContextMenuInvocation invocation) {

        List<JMenuItem> listMenuItems = new ArrayList<JMenuItem>();
        //子選單
        JMenuItem menuItem;
        menuItem = new JMenuItem("子選單測試");  

        //父級選單
        JMenu jMenu = new JMenu("Her0in");
        jMenu.add(menuItem);        
        listMenuItems.add(jMenu);
        return listMenuItems;
    }
}

IContextMenuInvocation

public interface IContextMenuInvocation

此介面被用於獲取當 Burp 呼叫擴充套件提供的 IContextMenuFactory 工廠裡的上下文選單時的一些細節,如能獲取到呼叫了擴充套件提供的自定義上下文選單的 Burp 工具名稱(在 IBurpExtenderCallbacks 中定義)或功能元件的名稱(在 IContextMenuInvocation 中定義)。

此介面提供瞭如下方法:

#!java  
// 此方法可被用於獲取本地Java輸入事件,並作為上下文選單呼叫的觸發器
java.awt.event.InputEvent   getInputEvent()

// 此方法被用於獲取上下文中被呼叫的選單
byte    getInvocationContext()

// 此方法被用於獲取使用者選中的 Scanner 問題的細節
IScanIssue[]    getSelectedIssues()

// 此方法被用於獲取當前顯示的或使用者選中的 HTTP 請求/響應的細節
IHttpRequestResponse[]  getSelectedMessages()

// 此方法被用於獲取使用者所選的當前訊息的界限(訊息需可適用)
int[]   getSelectionBounds()

// 此方法被用於獲取呼叫上下文選單的 Burp 工具
int getToolFlag()

Demo code:

#!java
package burp;

import java.util.ArrayList;
import java.util.List;

import javax.swing.JMenu;
import javax.swing.JMenuItem;

public class BurpExtender implements IBurpExtender, IContextMenuFactory{

    @Override
    public void registerExtenderCallbacks(final IBurpExtenderCallbacks callbacks){
        callbacks.setExtensionName("Her0in");
        callbacks.registerContextMenuFactory(this);
    }


    @Override
    public List<JMenuItem> createMenuItems(final IContextMenuInvocation invocation) {

        List<JMenuItem> listMenuItems = new ArrayList<JMenuItem>();
        // 選單隻在 REPEATER 工具的右鍵選單中顯示
        if(invocation.getToolFlag() == IBurpExtenderCallbacks.TOOL_REPEATER){
            //子選單
            JMenuItem menuItem;
            menuItem = new JMenuItem("子選單測試");  

            //父級選單
            JMenu jMenu = new JMenu("Her0in");
            jMenu.add(menuItem);        
            listMenuItems.add(jMenu);
        }
        return listMenuItems;
    }
}

ICookie

public interface ICookie

此介面用於獲取 HTTP cookie 的一些資訊。

#!java
// 此方法用於獲取 Cookie 的域
java.lang.String    getDomain()

// 此方法用於獲取 Cookie 的過期時間
java.util.Date  getExpiration()

// 此方法用於獲取 Cookie 的名稱
java.lang.String    getName()

// 此方法用於獲取 Cookie 的路徑
java.lang.String    getPath()

// 此方法用於獲取 Cookie 的值
java.lang.String    getValue()

IExtensionHelpers

public interface IExtensionHelpers

此介面提供了很多常用的輔助方法,擴充套件可以透過呼叫 IBurpExtenderCallbacks.getHelpers 獲得此介面的例項。

開發外掛常用的幾個方法如下:

#!java
// 此方法會新增一個新的引數到 HTTP 請求中,並且會適當更新 Content-Length
byte[]  addParameter(byte[] request, IParameter parameter)

// 此方法用於分析 HTTP 請求資訊以便獲取到多個鍵的值
IRequestInfo    analyzeRequest(byte[] request)

// 此方法用於分析 HTTP 響應資訊以便獲取到多個鍵的值
IResponseInfo   analyzeResponse(byte[] response)

// 構建包含給定的 HTTP 頭部,訊息體的 HTTP 訊息
byte[]  buildHttpMessage(java.util.List<java.lang.String> headers, byte[] body)

// 對給定的 URL 發起 GET 請求
byte[]  buildHttpRequest(java.net.URL url)

// bytes 到 String 的轉換
java.lang.String    bytesToString(byte[] data)

// String 到 bytes 的轉
java.lang.String    bytesToString(byte[] data)

IExtensionStateListener

public interface IExtensionStateListener

擴充套件可以實現此介面,然後呼叫 IBurpExtenderCallbacks.registerExtensionStateListener() 註冊一個擴充套件的狀態監聽器。在擴充套件的狀態發生改變時,監聽器將會收到通知。注意:任何啟動後臺執行緒或開啟系統資源(如檔案或資料庫連線)的擴充套件外掛都應該註冊一個監聽器,並在被解除安裝後終止執行緒/關閉資源。

此介面只提供了一個方法:

#!java
void    extensionUnloaded()

在外掛被 unload (解除安裝)時,會呼叫此方法,可以透過重寫此方法,在解除安裝外掛時,做一些善後處理工作。

Demo code:

#!java
package burp;
import java.io.PrintWriter;

public class BurpExtender implements IBurpExtender, IExtensionStateListener{

    private PrintWriter stdout;

    @Override
    public void registerExtenderCallbacks(final IBurpExtenderCallbacks callbacks){

        this.stdout = new PrintWriter(callbacks.getStdout(), true);

        callbacks.setExtensionName("Her0in");
        // 先註冊擴充套件狀態監聽器
        callbacks.registerExtensionStateListener(this);
    }

    // 重寫 extensionUnloaded 方法
    @Override
    public void extensionUnloaded() {
        // TODO 
        this.stdout.println("extensionUnloaded ...");
    }
}

IHttpListener

public interface IHttpListener

擴充套件可以實現此介面。透過呼叫 IBurpExtenderCallbacks.registerHttpListener() 註冊一個 HTTP 監聽器。Burp 裡的任何一個工具發起 HTTP 請求或收到 HTTP 響應都會通知此監聽器。擴充套件可以得到這些互動的資料,進行分析和修改。

此介面提供瞭如下方法:

#!java
void    processHttpMessage(int toolFlag, boolean messageIsRequest, IHttpRequestResponse messageInfo)

如果在開發外掛的時候需要獲取到所有的 HTTP 資料包,包括透過 Repeater 工具自定義修改的請求,則必須實現此介面,重寫該方法。

引數說明:

#!java  
// 指示了發起請求或收到響應的 Burp 工具的 ID,所有的 toolFlag 定義在 IBurpExtenderCallbacks 介面中。
int toolFlag

// 指示該訊息是請求訊息(值為True)還是響應訊息(值為False)
messageIsRequest

// 被處理的訊息的詳細資訊,是一個 IHttpRequestResponse 物件
messageInfo

Demo code:

#!java
package burp;

public class BurpExtender implements IBurpExtender, IHttpListener{

    @Override
    public void registerExtenderCallbacks(final IBurpExtenderCallbacks callbacks){

        callbacks.setExtensionName("Her0in");
        callbacks.registerHttpListener(this);
    }

    @Override
    public void processHttpMessage(int toolFlag, boolean messageIsRequest,
            IHttpRequestResponse messageInfo) {

        // TODO here
    }
}

IHttpRequestResponse

public interface IHttpRequestResponse

此介面用於檢索和更新有關 HTTP 訊息的詳細資訊。

注意:setter 方法通常只能在訊息被被處理之前使用,因為它是一個寫操作,因此在只讀的上下文中也是不可用的。與響應細節相關的 getter 方法只能用在請求發出後使用。

#!java
// 獲取使用者標註的註釋資訊
java.lang.String    getComment()
// 獲取使用者標註的高亮資訊
java.lang.String    getHighlight()
// 獲取請求/響應的 HTTP 服務資訊
IHttpService    getHttpService()
// 獲取 HTTP 請求資訊
byte[]  getRequest()
// 獲取 HTTP 響應資訊
byte[]  getResponse()
// 更新使用者標註的註釋資訊
void    setComment(java.lang.String comment)
// 更新使用者標註的高亮資訊
void    setHighlight(java.lang.String color)
// 更新 請求/響應的 HTTP 服務資訊 
void    setHttpService(IHttpService httpService)
// 更新 HTTP 請求資訊
void    setRequest(byte[] message)
// 更新 HTTP 響應資訊
void    setResponse(byte[] message)

IHttpRequestResponsePersisted

public interface IHttpRequestResponsePersisted extends IHttpRequestResponse

此介面是 IHttpRequestResponse 介面的一個子介面,該介面用於使用 IBurpExtenderCallbacks.saveBuffersToTempFiles() 將一個IHttpRequestResponse 物件的請求和響應訊息儲存到臨時檔案。

此介面只提供了一個方法:

#!java
void    deleteTempFiles()

注:此方法已經過時了,並且不會執行任何操作。

IHttpRequestResponseWithMarkers

public interface IHttpRequestResponseWithMarkers extends IHttpRequestResponse

此介面是 IHttpRequestResponse 介面的一個子介面,此介面用於那些已被標記的 IHttpRequestResponse 物件,擴充套件可以使用 IBurpExtenderCallbacks.applyMarkers() 建立一個此介面的例項,或提供自己的實現。標記可用於各種情況,如指定Intruder 工具的 payload 位置,Scanner 工具的插入點或將 Scanner 工具的一些問題置為高亮。

此介面提供了兩個分別操作請求和響應的方法:

#!java
// 獲取帶有標記的請求資訊的詳細資訊
java.util.List<int[]>   getRequestMarkers()

// 獲取帶有標記的請求資訊的詳細資訊
java.util.List<int[]>   getResponseMarkers()

這兩個方法的返回值均為一個整型陣列列表,分別表示請求訊息/響應訊息標記偏移的索引對。列表中的每一專案都是一個長度為 2 的整型陣列(int2)包含標記開始和結束的偏移量。如果沒有定義請求/響應標記,返回 null。

IHttpService

public interface IHttpService

此介面用於提供關於 HTTP 服務資訊的細節。

此介面提供瞭如下方法:

#!java
// 返回 HTTP 服務資訊的主機名或 IP 地址
java.lang.String    getHost()

// 返回 HTTP 服務資訊的埠
int getPort()

// 返回 HTTP 服務資訊的協議
java.lang.String    getProtocol()

Demo code:

#!java
package burp;

import java.io.PrintWriter;

public class BurpExtender implements IBurpExtender, IHttpListener{

    private PrintWriter stdout;
    public IBurpExtenderCallbacks iCallbacks;

    @Override
    public void registerExtenderCallbacks(final IBurpExtenderCallbacks callbacks){

        this.stdout = new PrintWriter(callbacks.getStdout(), true); 
        callbacks.setExtensionName("Her0in");
        callbacks.registerHttpListener(this);
    }

    @Override
    public void processHttpMessage(int toolFlag, boolean messageIsRequest,
            IHttpRequestResponse messageInfo) {

        IHttpService iHttpService = messageInfo.getHttpService();

        this.stdout.println(iHttpService.getHost());
        this.stdout.println(iHttpService.getPort());
        this.stdout.println(iHttpService.getProtocol());
    }
}

IInterceptedProxyMessage

public interface IInterceptedProxyMessage

注:
在 BurpSuite 的 Proxy 工具下的 Options 標籤裡有幾個自定義訊息攔截和響應的功能。讀者可以在熟悉了這幾個功能後,再瞭解此介面的作用。

此介面不能被擴充套件實現,它表示了已被 Burp 代理攔截的 HTTP 訊息。擴充套件可以利用此介面註冊一個 IProxyListener 以便接收代理訊息的細節。

此介面提供了以下方法:

#!java
// 獲取被攔截的請求訊息的客戶端 IP 地址
java.net.InetAddress    getClientIpAddress()

// 獲取當前定義的攔截操作型別,具體的型別可以在本介面中看到
int getInterceptAction()

// 獲取 Burp Proxy 處理攔截訊息監聽器的名稱
java.lang.String    getListenerInterface()

// 獲取被攔截的訊息的詳細資訊
IHttpRequestResponse    getMessageInfo()

// 獲取請求/響應訊息的唯一引用號
int getMessageReference()

// 設定更新攔截操作
void    setInterceptAction(int interceptAction)

Demo code:

#!java
package burp;

import java.io.PrintWriter;

public class BurpExtender implements IBurpExtender, IProxyListener{

    private PrintWriter stdout;

    @Override
    public void registerExtenderCallbacks(final IBurpExtenderCallbacks callbacks){
        callbacks.setExtensionName("Her0in");
        this.stdout = new PrintWriter(callbacks.getStdout(), true);
        callbacks.registerProxyListener(this);
    }

    @Override
    public void processProxyMessage(boolean messageIsRequest,
            IInterceptedProxyMessage message) {
        // 只操作請求訊息
        if(messageIsRequest){
            // 獲取並列印出客戶端 IP
            this.stdout.println(message.getClientIpAddress());
            // Drop 掉所有請求
            message.setInterceptAction(IInterceptedProxyMessage.ACTION_DROP);
            // TODO here
        }       
    }
}

IIntruderAttack

public interface IIntruderAttack

此介面用於操控 Intruder 工具的攻擊詳情。

此介面提供了以下方法:

#!java
// 獲取攻擊中的 HTTP 服務資訊
IHttpService    getHttpService()

// 獲取攻擊中的請求模版
byte[]  getRequestTemplate()

IIntruderPayloadGenerator

public interface IIntruderPayloadGenerator

此介面被用於自定義 Intruder 工具的 payload 生成器。當需要發起一次新的 Intruder 攻擊時,擴充套件需要註冊一個 IIntruderPayloadGeneratorFactory 工廠並且必須返回此介面的一個新的例項。此介面會將當前外掛註冊為一個 Intruder 工具的 payload 生成器。

#!java
此介面提供瞭如下方法:  
// 此方法由 Burp 呼叫,用於獲取下一個 payload 的值
byte[]  getNextPayload(byte[] baseValue)

// 此方法由 Burp 呼叫,用於決定 payload 生成器是否能夠提供更多 payload
boolean hasMorePayloads()

// 此方法由 Burp 呼叫,用於重置 payload 生成器的狀態,這將導致下一次呼叫 getNextPayload() 方法時會返回第一條 payload
void    reset()

Demo code:

#!java
package burp;

public class BurpExtender implements IBurpExtender, IIntruderPayloadGeneratorFactory{

    @Override
    public void registerExtenderCallbacks(final IBurpExtenderCallbacks callbacks){
        callbacks.setExtensionName("Her0in");
        // 將當前外掛註冊為一個 Intruder 工具的 payload 生成器
        callbacks.registerIntruderPayloadGeneratorFactory(this);
    }

    @Override
    public String getGeneratorName() {
        // 設定 payload 生成器名稱
        return "自定義 payload 生成器";
    }

    @Override
    public IIntruderPayloadGenerator createNewInstance(IIntruderAttack attack) {
        // 返回一個新的 payload 生成器的例項
        return new IntruderPayloadGenerator();
    }

     // 實現 IIntruderPayloadGenerator 介面,此介面提供的方法是由 Burp 來呼叫的
    class IntruderPayloadGenerator implements IIntruderPayloadGenerator{

        @Override
        public boolean hasMorePayloads() {
            // TODO here
            return false;
        }

        @Override
        public byte[] getNextPayload(byte[] baseValue) {
            // TODO here
            return null;
        }

        @Override
        public void reset() {
            // TODO here

        }
    }
}

在 Burp 載入了上述外掛後,可以按照下圖示紅的步驟操作,即可看到自定義的 payload 生成器:

p1

IIntruderPayloadGeneratorFactory

public interface IIntruderPayloadGeneratorFactory

擴充套件可以實現此介面,並且可以呼叫 IBurpExtenderCallbacks.registerIntruderPayloadGeneratorFactory() 註冊一個自定義的 Intruder 工具的 payload 生成器。

該介面提供了以下方法:

#!java
// 此方法由 Burp 呼叫,用於建立一個 payload 生成器的新例項。當使用者發動一次 Intruder 攻擊時,將會使用該方法返回的 payload 生成器的例項
IIntruderPayloadGenerator   createNewInstance(IIntruderAttack attack)

// 此方法由 Burp 呼叫,用於獲取 payload 生成器的名稱
java.lang.String    getGeneratorName()

IIntruderPayloadProcessor

public interface IIntruderPayloadProcessor

擴充套件可以實現此介面,並且可以呼叫 IBurpExtenderCallbacks.registerIntruderPayloadProcessor() 註冊一個自定義 Intruder 工具的 payload 的處理器。此介面會將當前外掛註冊為一個 Intruder 工具的 payload 處理器。

該介面提供了以下方法:

#!java
// 此方法由 Burp 呼叫,用於獲取 payload 處理器的名稱
java.lang.String    getProcessorName()

// 此方法由 Burp 呼叫,當處理器每次應用 payload 到一次 Intruder 攻擊時,Burp 都會呼叫一次此方法
byte[]  processPayload(byte[] currentPayload, byte[] originalPayload, byte[] baseValue)

// processPayload 方法說明:

引數說明:

  • currentPayload - 當前已被處理過的 payload 的值
  • originalPayload - 在應用處理規則之前的 payload 的原始值
  • baseValue - payload 位置的基準值,將用當前已被處理過的 payload 替代

返回值:
返回已被處理過的 payload 的值。 如果返回 null 意味著當前的 payload 將被跳過,並且此次攻擊將被直接移動到下一個 payload 。

Demo code:

#!java
package burp;

public class BurpExtender implements IBurpExtender, IIntruderPayloadProcessor{

    @Override
    public void registerExtenderCallbacks(final IBurpExtenderCallbacks callbacks){
        callbacks.setExtensionName("Her0in");
        // 將當前外掛註冊為一個 Intruder 工具的 payload 處理器
        callbacks.registerIntruderPayloadProcessor(this);
    }

    // 此方法由 Burp 呼叫
    @Override
    public String getProcessorName() {
        // 設定自定義 payload 處理器的名稱
        return "自定義 payload 處理器";
    }

    // 此方法由 Burp 呼叫,且會在每次使用一個 payload 發動攻擊時都會呼叫一次此方法
    @Override
    public byte[] processPayload(byte[] currentPayload, byte[] originalPayload,
            byte[] baseValue) {
        // TODO here
        return null;
    }
}

在 Burp 載入了上述外掛後,可以按照下圖示紅的步驟操作,即可看到自定義的 payload 生成器:

p2

IMenuItemHandler

public interface IMenuItemHandler

此介面已過時,不推薦再使用,請使用IContextMenuFactory代替。

擴充套件可以實現此介面,並且透過呼叫 IBurpExtenderCallbacks.registerMenuItem() 方法註冊一個自定義的上下文選單項。

此介面提供瞭如下方法:

#!java
// 當使用者單擊一個已經在 Burp 中註冊過的上下文選單項時 Burp 會呼叫一次此方法。不過,此方法已經過時
void    menuItemClicked(java.lang.String menuItemCaption, IHttpRequestResponse[] messageInfo)  

本文由 Her0in 原創並首發於烏雲drops,轉載請註明出處

本文章來源於烏雲知識庫,此映象為了方便大家學習研究,文章版權歸烏雲知識庫!

相關文章