【BurpSuite 2025最新版插件開發】基礎篇7:數據的持久化存儲

1 前言

歷史章節:

【BurpSuite 2025最新版插件開發】基礎篇1:環境搭建

【BurpSuite 2025最新版插件開發】基礎篇2:插件生命周期與核心接口

【BurpSuite 2025最新版插件開發】基礎篇3:請求攔截和修改簡單示例

【BurpSuite 2025最新版插件開發】基礎篇4:HTTP流量處理

【BurpSuite 2025最新版插件開發】基礎篇5:UI組件開發

【BurpSuite 2025最新版插件開發】基礎篇6:UI組件與數據傳輸

本章節注意講解 BurpSuite 插件中對于數據持久化存儲的基本使用。

2 接口簡介

BurpSuite 官方接口
在這里插入圖片描述

2.1 PersistedList<T>:項目級列表存儲

  • 功能定位
    存儲有序的、可重復的數據列表,支持泛型類型(如字符串、整數等),數據隨Burp項目文件保存。
  • 核心特性
    • 類型安全:通過泛型約束元素類型(如PersistedList<String>)。
    • 項目隔離:每個項目獨立保存列表數據,切換項目時自動加載對應數據。
    • 動態操作:支持addremovesize等列表操作,適合存儲可變數據集合(如URL歷史記錄)。
  • 使用場景
    存儲插件運行時動態生成的列表數據(如掃描結果、自定義Payload列表)。

2.2 PersistedObject:項目級復雜對象存儲(僅供專業版)

  • 功能定位
    存儲單個結構化對象(如配置類、自定義數據模型),需實現java.io.Serializable接口。
  • 核心特性
    • 復雜數據支持:可存儲嵌套對象、集合等復雜結構。
    • 項目綁定:數據與項目關聯,適合保存項目特定的配置或狀態。
    • 版本兼容性:需注意序列化版本UID,避免跨版本兼容性問題。
  • 使用場景
    存儲插件的完整配置(如多模塊掃描策略)或復雜狀態數據。

2.3 Persistence:持久化功能入口

  • 功能定位
    工廠接口,用于創建和管理PersistedListPersistedObject實例。
  • 核心方法
    • createPersistedList(String name, Class<T> elementType):創建命名列表。
    • persistedObject(String name):獲取或創建命名對象。
  • 使用場景
    插件初始化時通過montoya.persistence()獲取實例,再創建具體持久化存儲。

2.4 Preferences:用戶級全局配置

  • 功能定位
    存儲與項目無關的用戶偏好或全局設置(如API密鑰、界面主題)。
  • 核心特性
    • 跨項目共享:數據存儲在用戶配置文件中,所有項目均可訪問。
    • 基本類型支持:僅支持字符串、布爾值、整數等簡單類型。
    • 監聽機制:可注冊監聽器實時響應配置變化。
  • 使用場景
    存儲插件的全局設置(如默認掃描選項、認證憑證)。

2.5 持久化接口對比與選擇建議

接口名稱PersistedListPersistedObjectPersistencePreferences
功能定位存儲有序、可重復的數據列表,支持泛型類型。存儲單個結構化對象(如配置類、數據模型)。工廠接口,用于創建和管理其他持久化接口。存儲用戶級全局配置(與項目無關)。
數據作用域項目級(隨項目文件保存)。項目級(隨項目文件保存)。-用戶級(跨項目共享)。
支持數據類型泛型列表(需指定元素類型)。內置類型(如HTTP請求/響應)、自定義對象。-基本類型(String、Boolean、Integer等)。
序列化要求元素需實現 Serializable(如自定義類)。文檔未明確要求,但自定義對象可能需適配。-無需序列化。
核心方法add, remove, get, size, clearset, get, setChildObject, removecreatePersistedList, persistedObjectput, get, remove, addListener
典型場景存儲動態生成的項目相關列表(如URL歷史)。存儲復雜配置或項目狀態(如多模塊策略)。插件初始化時獲取持久化功能入口。存儲全局用戶偏好(如API密鑰、主題)。
版本限制社區版/專業版均可使用。專業版(標注 [Professional only])。社區版/專業版均可使用。社區版/專業版均可使用。

關鍵說明

  1. PersistedList 適合動態增刪的列表場景,但查詢效率依賴列表長度(O(n))。
  2. PersistedObject 支持復雜數據結構,但需注意專業版限制及可能的序列化適配。
  3. Persistence 是創建其他持久化對象的唯一入口,需通過 montoya.persistence() 獲取。
  4. Preferences 適合存儲與項目無關的配置,數據跨項目共享且無需序列化。

3 實戰模擬

插件實現如下需求:

  • 通過 HTTP 接口獲取不同類型用戶的信息:token、uid、role 后進行持久化存儲。
  • 在業務接口中使用不同類型用戶的信息調用業務接口,來測試業務接口的權限隔離。
  • 使用 BurpSuite 版本通用PersistedList 接口實現數據持久化。

4 代碼示例

4.1 服務端代碼

使用 python 代碼實現極簡服務端,實現如下需求:

  • 預先定義了系統固定的用戶和管理員信息,包含 token、uid 和 role 三個字段。
  • 實現 3 個接口:
  1. 獲取用戶信息接口(/user_info)

    • 請求方法:GET
    • 功能:返回預先定義的用戶信息,包含 token、uid 和 role。
    • 響應示例:
      在這里插入圖片描述
  2. 獲取管理員信息接口(/admin_info)

    • 請求方法:GET
    • 功能:返回預先定義的管理員信息,包含 token、uid 和 role。
    • 響應示例:在這里插入圖片描述
  3. 添加用戶接口(/add_user)

    • 請求方法:POST

    • 請求參數:以 JSON 格式傳遞 token、uid 和 role 三個參數。

    • 功能:檢查傳入的參數是否與預先定義的管理員信息一致,若一致則返回添加成功的消息;若不一致則返回添加失敗的消息。

    • 成功響應示例:在這里插入圖片描述

    • 失敗響應示例:
      在這里插入圖片描述

服務端 python 代碼:

from flask import Flask, request, jsonifyapp = Flask(__name__)# 模擬用戶和管理員信息
USER_INFO = {"token": "user_token_123","uid": "user_uid_123","role": "user"
}ADMIN_INFO = {"token": "admin_token_123","uid": "admin_uid_123","role": "admin"
}# 獲取用戶信息接口
@app.route('/user_info', methods=['GET'])
def get_user_info():return jsonify(USER_INFO)# 獲取管理員信息接口
@app.route('/admin_info', methods=['GET'])
def get_admin_info():return jsonify(ADMIN_INFO)# 添加用戶接口
@app.route('/add_user', methods=['POST'])
def add_user():data = request.get_json()if not data or 'token' not in data or 'uid' not in data or 'role' not in data:return jsonify({"message": "Missing parameters"}), 400if data['token'] == ADMIN_INFO['token'] and data['uid'] == ADMIN_INFO['uid'] and data['role'] == ADMIN_INFO['role']:return jsonify({"message": "User added successfully"}), 200else:return jsonify({"message": "Adding user failed"}), 400if __name__ == '__main__':app.run(debug=True)

通過命令行啟動:
在這里插入圖片描述

4.2 插件代碼

實現需求:

  • 攔截 HTTP 響應、持久化存儲用戶數據。
  • 通過右鍵菜單觸發的業務接口的測試請求。
  • 測試請求分別使用 user 和 admin 的信息請求 /add_user 接口。
  1. Extension.java
    • 插件的主類,實現了 BurpExtension 接口,設置插件名稱。
    • 創建兩個 PersistedList<String> 實例,用于持久化存儲用戶信息和管理員信息。
    • 注冊 CustomHttpHandler 來處理 HTTP 請求/響應。
    • 注冊 TestMenu 右鍵菜單項。
import burp.api.montoya.BurpExtension;
import burp.api.montoya.MontoyaApi;
import burp.api.montoya.persistence.PersistedList;@SuppressWarnings("unused")
public class Extension implements BurpExtension {@Overridepublic void initialize(MontoyaApi montoyaApi) {montoyaApi.extension().setName("My Extension");// 創建持久化對象PersistedList<String> userInfoList = PersistedList.persistedStringList();PersistedList<String> adminInfoList = PersistedList.persistedStringList();// HTTP 監聽器montoyaApi.http().registerHttpHandler(new CustomHttpHandler(montoyaApi, userInfoList, adminInfoList));// 注冊右鍵-測試請求montoyaApi.userInterface().registerContextMenuItemsProvider(new TestMenu(montoyaApi, userInfoList, adminInfoList));}
}
  1. CustomHttpHandler.java
    • 該類實現了 HttpHandler 接口,用于監聽和處理 HTTP 請求與響應。
    • handleHttpResponseReceived 方法中,檢查響應內容是否包含 "role": "user""role": "admin",并分別將這些信息添加到 userInfoListadminInfoList 中。
import burp.api.montoya.MontoyaApi;
import burp.api.montoya.http.handler.*;
import burp.api.montoya.persistence.PersistedList;public class CustomHttpHandler implements HttpHandler {private final MontoyaApi montoyaApi;private final PersistedList<String> userInfoList;private final PersistedList<String> adminInfoList;public CustomHttpHandler(MontoyaApi montoyaApi, PersistedList<String> userInfoList, PersistedList<String> adminInfoList) {this.montoyaApi = montoyaApi;this.userInfoList = userInfoList;this.adminInfoList = adminInfoList;}@Overridepublic RequestToBeSentAction handleHttpRequestToBeSent(HttpRequestToBeSent httpRequestToBeSent) {return RequestToBeSentAction.continueWith(httpRequestToBeSent);}@Overridepublic ResponseReceivedAction handleHttpResponseReceived(HttpResponseReceived httpResponseReceived) {// 持久化存儲if (httpResponseReceived.bodyToString().contains("\"role\": \"user\"")) {userInfoList.add(httpResponseReceived.body().toString());String userValue = userInfoList.stream().findFirst().orElse("無用戶信息");montoyaApi.logging().logToOutput("獲取 UserInfoList: " + userValue);}if (httpResponseReceived.bodyToString().contains("\"role\": \"admin\"")) {adminInfoList.add(httpResponseReceived.body().toString());String adminValue = adminInfoList.stream().findFirst().orElse("無管理員信息");montoyaApi.logging().logToOutput("獲取 AdminInfoList: " + adminValue);}// 打印響應montoyaApi.logging().logToOutput("響應體: " + httpResponseReceived.bodyToString());return ResponseReceivedAction.continueWith(httpResponseReceived);}
}
  1. TestMenu.java
    • 該類實現了 ContextMenuItemsProvider 接口,為 Burp 的上下文菜單提供自定義菜單項。
    • 提供一個名為“測試請求”的菜單項;點擊菜單項后會調用 MyRequest.sendTestRequest(...) 方法,傳遞 userInfoListadminInfoList
    • 使用事件監聽機制來觸發請求。
import burp.api.montoya.MontoyaApi;
import burp.api.montoya.persistence.PersistedList;
import burp.api.montoya.ui.contextmenu.ContextMenuEvent;
import burp.api.montoya.ui.contextmenu.ContextMenuItemsProvider;import javax.swing.*;
import java.awt.*;
import java.util.ArrayList;
import java.util.List;public class TestMenu implements ContextMenuItemsProvider {private final MontoyaApi montoyaApi;private final PersistedList<String> userInfoList;private final PersistedList<String> adminInfoList;public TestMenu(MontoyaApi montoyaApi, PersistedList<String> userInfoList, PersistedList<String> adminInfoList) {this.montoyaApi = montoyaApi;this.userInfoList = userInfoList;this.adminInfoList = adminInfoList;}@Overridepublic List<Component> provideMenuItems(ContextMenuEvent event) {List<Component> menuItems = new ArrayList<>();JMenuItem menuItem = new JMenuItem("測試請求");menuItem.addActionListener(e -> {MyRequest myRequest = new MyRequest(montoyaApi);myRequest.sendTestRequest(userInfoList, adminInfoList);});menuItems.add(menuItem);return menuItems;}
}
  1. MyRequest.java
    • 該類封裝了發送 HTTP 請求的邏輯。
    • sendTestRequest(...) 方法從 PersistedList<String> 中提取第一個用戶信息和管理員信息;如果信息為空,則記錄錯誤日志;
    • 使用 SwingWorker 異步執行網絡操作,避免阻塞主線程;
    • sendRequest(...) 方法解析 JSON 數據,并構造新的 HTTP POST 請求發送到服務器。
import burp.api.montoya.MontoyaApi;
import burp.api.montoya.http.HttpService;
import burp.api.montoya.http.message.requests.HttpRequest;
import burp.api.montoya.persistence.PersistedList;
import burp.api.montoya.utilities.json.JsonUtils;import javax.swing.*;public class MyRequest {private final MontoyaApi montoyaApi;public MyRequest(MontoyaApi montoyaApi) {this.montoyaApi = montoyaApi;}public void sendTestRequest(PersistedList<String> userInfoList, PersistedList<String> adminInfoList) {String userValue = userInfoList.stream().findFirst().orElse("");String adminValue = adminInfoList.stream().findFirst().orElse("");if (userValue.isEmpty() || adminValue.isEmpty()) {montoyaApi.logging().logToError("no user info or admin info");return;}new SwingWorker<Void, Void>() {@Overrideprotected Void doInBackground() {sendRequest(userInfoList, "user");sendRequest(adminInfoList, "admin");return null;}}.execute();}private void sendRequest(PersistedList<String> dataList, String roleType) {try {String infoValue = dataList.stream().findFirst().orElse(null);if (infoValue == null) {montoyaApi.logging().logToError("數據為空: " + roleType);return;}JsonUtils jsonUtils = montoyaApi.utilities().jsonUtils();String role = jsonUtils.readString(infoValue, "role");String token = jsonUtils.readString(infoValue, "token");String uid = jsonUtils.readString(infoValue, "uid");String requestBody = String.format("{\"role\":\"%s\",\"token\":\"%s\",\"uid\":\"%s\"}", role, token, uid);HttpService httpService = HttpService.httpService("localhost", 5000, false);HttpRequest httpRequest = HttpRequest.httpRequest().withPath("/add_user").withService(httpService).withBody(requestBody).withHeader("Content-Type", "application/json").withMethod("POST");montoyaApi.http().sendRequest(httpRequest);} catch (Exception e) {montoyaApi.logging().logToError("error:" + e.getMessage());}}
}

5 效果展示

5.1 抓包接口獲取用戶數據

獲取 user 信息:
在這里插入圖片描述
獲取 admin 信息:
在這里插入圖片描述
日志打印:
在這里插入圖片描述

5.2 右鍵觸發測試請求

觸發請求 /add_user 接口:
在這里插入圖片描述
日志打印:可以看到輸出日志符合服務端的判斷。

插件:

sendRequest(userInfoList, "user");
sendRequest(adminInfoList, "admin");

服務端:

if data['token'] == ADMIN_INFO['token'] and data['uid'] == ADMIN_INFO['uid'] and data['role'] == ADMIN_INFO['role']:return jsonify({"message": "User added successfully"}), 200else:return jsonify({"message": "Adding user failed"}), 400

在這里插入圖片描述

6 總結

  • 整個插件的功能流程如下:

    1. 攔截響應:通過 CustomHttpHandler 類攔截 HTTP 響應,識別包含 "role": "user""role": "admin"的響應體,并將其持久化存儲到 PersistedList 中;
    2. 持久化存儲:使用 Montoya API 的 PersistedList 來保存用戶和管理員信息;
    3. 觸發測試請求:通過右鍵菜單項(由 TestMenu 類實現)觸發測試請求;
    4. 異步發送請求:在后臺線程中使用 MyRequest 類發送包含用戶和管理員信息的 HTTP 請求,避免阻塞 UI。
  • 本插件適用于需要從響應中提取特定信息基于這些信息發起新請求的安全測試場景。

:由于社區版不支持保存項目到本地,因此要最大程度的發揮persistence的作用建議使用專業版

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/87307.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/87307.shtml
英文地址,請注明出處:http://en.pswp.cn/web/87307.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

GPT-4 Turbo集成智能工作流,開啟自動化研究與知識管理新篇章!

目錄 一、系統架構設計二、核心模塊實現1. 智能數據采集引擎2. 自動化研究引擎3. 知識管理系統 三、智能工作流引擎四、關鍵技術實現1. 動態工作流引擎2. 知識圖譜構建 五、企業級部署方案1. 云原生架構2. Docker部署腳本 六、應用案例&#xff1a;藥物研發項目七、性能優化策略…

告別SQL卡頓與混亂!AI如何賦能實時計算?

在當今數據驅動的商業環境中&#xff0c;SQL作為與數據庫交互的核心語言&#xff0c;其編寫效率和質量直接影響著企業的數據決策速度和系統性能。然而&#xff0c;我們在長期的企業服務實踐中發現&#xff0c;數據庫開發人員普遍面臨以下痛點&#xff1a; SQL性能問題頻發&…

LeetCode算法(和中等打的有來有回)——盛最多水的容器

文章目錄 leetcode第11題&#xff1a;盛最多水的容器二次循環代碼 雙指針優化解析代碼 leetcode第11題&#xff1a;盛最多水的容器 二次循環 這道題比較容易想到的就是通過二次循環遍歷所有能盛的水的體積。 代碼 class Solution {public int maxArea(int[] height) {// 記錄…

Karmada 多集群服務發現

一、背景介紹 多集群架構下&#xff0c;不同 Kubernetes 集群間的服務如何互通是核心挑戰。Karmada 支持 Kubernetes Multi?cluster Service APIs&#xff08;MCS&#xff09;&#xff0c;通過 ServiceExport 和 ServiceImport 實現跨集群服務發現與調用&#xff0c;幫助多集…

macOS 26正式發布,全新Liquid Glass設計語言亮相

在全球科技愛好者翹首以盼的WWDC 2025開發者大會上&#xff0c;蘋果公司正式揭開了macOS 26系統的神秘面紗。此次系統更新最令人矚目的&#xff0c;當屬其采用的全新Liquid Glass設計語言&#xff0c;該設計不僅重塑了Mac的視覺風格&#xff0c;更為用戶帶來了一場前所未有的操…

網絡基礎(3)

網絡基礎&#xff08;3&#xff09; 有關進程 1&#xff09;進程是人在系統中的代表&#xff0c;只要把數據給進程&#xff0c;人就相當于拿到了數據 2&#xff09;數據傳輸到主機不是目的&#xff0c;而是手段。到達主機內部&#xff0c;再交給主機內的進程才是目的 上網的…

C語言專題:17.邏輯運算與三目運算符(按位邏輯運算、條件運算符)

? C語言中的邏輯運算符和三目運算符&#xff08;條件運算符&#xff09;是非常常見且基礎的操作符&#xff0c;它們分別用于布爾邏輯運算和簡化條件判斷的表達式。通過合理使用這些運算符&#xff0c;可以使代碼更加簡潔、清晰。本文將重點介紹邏輯運算符、三目運算符和按位邏…

【分布式 ID】一文詳解美團 Leaf

文章目錄 1. 前言2. 項目啟動示例 - MYSQL 和 Zookeepr2.1 Leaf-segment 模式2.2 Leaf-snowflake 模式 - 單節點2.3 Leaf-snowflake 模式 - 多節點 3. Leaf-segment 詳細講解4. Leaf-segment 源碼解析4.1 SegmentBuffer 號段緩存4.2 Segment 號段4.3 初始化號段服務 SegmentIDG…

互聯網大廠Java面試實錄:Spring Boot與微服務在電商場景中的應用

互聯網大廠Java面試實錄&#xff1a;Spring Boot與微服務在電商場景中的應用 面試場景 面試官&#xff1a;你好&#xff0c;謝飛機&#xff0c;歡迎參加我們的Java開發崗位面試。首先&#xff0c;能否簡單介紹一下你的技術背景&#xff1f; 謝飛機&#xff1a;嗨&#xff0c…

XILINX Ultrascale+ Kintex系列FPGA的架構

Xilinx&#xff08;現為AMD&#xff09;Kintex UltraScale系列FPGA是基于16nm FinFET工藝的高性能、中等成本的現場可編程門陣列&#xff0c;專為高帶寬、低功耗和成本效益的應用設計&#xff0c;廣泛用于5G通信、數據中心、視頻處理、航空航天等領域。以下詳細介紹Kintex Ultr…

騰訊云實名資質 “待補充后提交” 解決方法

目錄 一、引言二、為什么會出現 “待補充后提交” 狀態三、需要補充的具體材料3.1 營業執照3.2 法人身份證相關3.3 短信管理員資料3.4 合規使用承諾函 四、處理流程詳細步驟4.1 登錄騰訊云控制臺4.2 進入實名資質相關頁面4.3 上傳補充材料4.4 提交審核 五、注意事項5.1 材料規范…

8分鐘講完 Tomcat架構及工作原理

https://www.bilibili.com/video/BV1J3411k7Xc/?spm_id_from333.337.search-card.all.click&vd_source36145f3620bdf21c0f1a843352e603fb JavaWeb開發必看&#xff01;Tomcat架構及工作原理&#xff08;8分鐘&#xff09; 分闡明了Tomcat的工作原理。 一、Tomcat的核心架…

C盤爆滿元兇!WinSxS組件解密

C盤爆滿元兇!WinSxS組件解密 WinSxS是什么?核心功能與重要性目錄為何瘋狂膨脹?安全清理權威指南優先使用微軟官方工具:DISM工具清理效果與性能影響重要風險提示總結C盤爆滿元兇!WinSxS組件解密你是否也遇到過: C盤空間頻頻告急,檢查發現WinSxS文件夾竟獨占數十GB空間?想…

畢業設計(啟智模塊化機器人的組裝與K5的使用

記錄一下 畢業設計的部分筆記 準備清空文件發到csdn做一個紀念0.0 物聯網畢業設計 機器的組裝與K5的使用 基礎文件的學習 首先安裝K5 和文件包中的JLink驅動 并且文件實例里的代碼必須加上x后綴否則 只能用K4 來打開 供電&#xff1a;整個系統都需要電池運轉 build 存放…

從0開始學習R語言--Day37--CMH檢驗

對于有多個特征的數據&#xff0c;我們一般的處理方式是構建特征函數&#xff0c;計算每個特征向量的系數&#xff0c;從而將其影響納入到研究量中&#xff0c;但對于簡單的問題&#xff0c;也這樣做的話未免有點小題大做。這時我們可以考慮用CMH來分析變量在每個特征下的影響&…

搜索選擇DFS還是BFS

1. DFS&#xff08;深度優先搜索&#xff09;&#xff1a;優先進行深度縱向搜索&#xff0c;DFS所需的內存少于BFS所需的內存&#xff0c;利用堆棧實現&#xff0c;適合找最短路徑。 2. BFS&#xff08;廣度優先搜索&#xff09;&#xff1a;優先進行廣度橫向搜索&#xff0c;…

三格電子——電力協議轉換器

Modbus 轉 IE104 網關型號 SG-TCP-IEC104 &#xff0c;是三格電子推出的工業級網關&#xff08;以下簡稱網 關&#xff09;&#xff0c;主要用于 Modbus RTU/TCP/ASCII 數據采集、 DLT645-1997/2007 數據采集&#xff0c;可接多功 能電力儀表、溫控儀、電表等&#xf…

UE5 瞄準偏移(AimOffset)功能詳解

什么是AimOffset? AimOffset(瞄準偏移)是一種特殊的動畫混合空間(類似于 Blend Space),它通過將多個預設姿勢疊加到一個基礎動作上,實現角色根據視角方向進行上下左右的動畫混合。簡單來說,AimOffset 在射擊游戲中常用來處理角色持槍瞄準時的動作,比如抬頭、低頭、左…

在Ubuntu24上安裝ollama

安裝ollama之前&#xff0c;建議檢查顯卡驅動是否安裝完成。如果還未安裝顯卡驅動&#xff0c;建議先安裝顯卡驅動再安裝ollama。 安裝curl sudo apt update sudo apt -y install curl進入ollama的下載網站 https://ollama.com/download/linux 復制安裝腳本&#xff0c;并在…

【Kafka使用方式以及原理】

Kafka生產者發送消息的方式 Kafka生產者發送消息主要通過以下三種方式&#xff1a; 同步發送 生產者發送消息后&#xff0c;會阻塞等待Broker的響應&#xff0c;確認消息是否成功寫入。這種方式可靠性高&#xff0c;但吞吐量較低。代碼示例&#xff1a; ProducerRecord<S…