burpsuite 插件编写入门【暴躁脾气】
字数 1363 2025-08-20 18:18:40

BurpSuite插件编写入门教程

1. 背景与需求

本教程旨在指导如何编写BurpSuite插件,特别是针对修改JavaScript响应内容的需求。作者在实际渗透测试中发现,通过Hook前端危险函数并查找同级或上级过滤函数的方法很有价值,但遇到了"use strict"模式导致callee.caller无法使用的问题,因此需要开发Burp插件来自动移除JS文件中的严格模式声明。

2. 开发环境配置

2.1 环境准备

  • Python环境:需要使用Jython(Java实现的Python)
  • 配置步骤
    1. 在BurpSuite中配置Python环境路径为Jython的安装路径
    2. 确保相关API包与Python脚本同级目录

注意:作者尝试过Java环境打包成可执行JAR,但遇到了依赖问题,最终选择了Jython方案

3. 插件基础结构

3.1 核心接口

Burp插件需要实现以下接口:

  • IBurpExtender:插件入口接口
  • IHttpListener:HTTP请求/响应监听接口

3.2 基本类结构

class SomebodyExtender(IBurpExtender, IHttpListener):
    def registerExtenderCallbacks(self, callbacks):
        self._callbacks = callbacks
        self._callbacks.registerHttpListener(self)  # 注册HTTP监听器
    
    def processHttpMessage(self, toolFlag, messageIsRequest, messageInfo):
        pass

4. 核心API详解

4.1 IBurpExtenderCallbacks关键方法

  • getHelpers():获取辅助工具对象
  • getStdout():获取标准输出
  • registerHttpListener():注册HTTP监听器
  • getParameters():获取请求参数(仅适用于请求)
  • getHeaders():获取头部信息

4.2 IExtensionHelpers关键方法

  • analyzeResponse():分析响应内容,返回IResponseInfo对象
  • bytesToString():字节转字符串
  • stringToBytes():字符串转字节

4.3 IHttpRequestResponse

  • 包含完整的请求/响应会话
  • 方法:
    • getRequest():获取请求内容
    • getResponse():获取响应内容
    • setResponse():设置响应内容

5. 实现响应内容修改

5.1 处理流程

def processHttpMessage(self, toolFlag, messageIsRequest, messageInfo):
    if not messageIsRequest:  # 只处理响应
        request_headers = self._callbacks.getHeaders(messageInfo.getRequest())
        if ".js" in request_headers[0]:  # 判断是否为JS文件
            self._processJsResponse(messageInfo)

5.2 处理JS响应

def _processJsResponse(self, messageInfo):
    helper = self._callbacks.getHelpers()
    response_info = helper.analyzeResponse(messageInfo.getResponse())
    response_raw = messageInfo.getResponse()
    
    # 获取响应体
    response_body = response_raw[response_info.getBodyOffset():]
    
    # 转换并修改内容
    js_content = helper.bytesToString(response_body)
    modified_js = js_content.replace('\'use strict\'', '').replace('"use strict"', '')
    
    # 更新Content-Length
    response_headers = self._callbacks.getHeaders(messageInfo.getResponse())
    new_headers = []
    for header in response_headers:
        if header.startswith("Content-Length:"):
            new_headers.append(f"Content-Length: {len(modified_js)}")
        else:
            new_headers.append(header)
    
    # 构建完整响应并设置
    entire_response = helper.stringToBytes("\n".join(new_headers) + "\n\n" + modified_js)
    messageInfo.setResponse(entire_response)

6. 常见问题与解决方案

6.1 环境配置问题

  • 问题:新版PyCharm/Eclipse不兼容Jython
  • 解决:直接使用文本编辑器编写,或忍受缺乏语法提示

6.2 API使用误区

  • 误区:在响应处理中使用getParameters()
  • 原因:该方法会移除等号,导致JS语法错误
  • 正确做法:直接处理原始响应体

6.3 严格模式处理

  • 目前方案只能处理静态的"use strict"声明
  • 动态生成的严格模式声明需要更复杂的处理逻辑

7. 完整代码示例

from burp import IBurpExtender, IHttpListener, IHttpRequestResponse

class SomebodyExtender(IBurpExtender, IHttpListener):
    def registerExtenderCallbacks(self, callbacks):
        self._callbacks = callbacks
        self._helpers = callbacks.getHelpers()
        callbacks.setExtensionName("Remove Strict Mode")
        callbacks.registerHttpListener(self)
    
    def processHttpMessage(self, toolFlag, messageIsRequest, messageInfo):
        if not messageIsRequest:
            request_headers = self._callbacks.getHeaders(messageInfo.getRequest())
            if len(request_headers) > 0 and ".js" in request_headers[0]:
                self._processJsResponse(messageInfo)
    
    def _processJsResponse(self, messageInfo):
        response_info = self._helpers.analyzeResponse(messageInfo.getResponse())
        response_raw = messageInfo.getResponse()
        response_body = response_raw[response_info.getBodyOffset():]
        
        js_content = self._helpers.bytesToString(response_body)
        modified_js = js_content.replace('\'use strict\'', '').replace('"use strict"', '')
        
        response_headers = self._callbacks.getHeaders(messageInfo.getResponse())
        new_headers = []
        for header in response_headers:
            if header.startswith("Content-Length:"):
                new_headers.append(f"Content-Length: {len(modified_js)}")
            else:
                new_headers.append(header)
        
        entire_response = self._helpers.stringToBytes("\n".join(new_headers) + "\n\n" + modified_js)
        messageInfo.setResponse(entire_response)

8. 扩展思路

  1. 增强严格模式处理:使用正则表达式匹配更复杂的严格模式声明
  2. 性能优化:添加缓存机制避免重复处理相同JS文件
  3. 错误处理:添加异常捕获和日志记录
  4. UI集成:添加配置界面让用户自定义处理规则

9. 总结

本教程详细介绍了如何开发一个能够修改JS响应内容的BurpSuite插件,重点包括:

  • 环境配置和API理解
  • 核心接口的实现
  • 响应内容的分析和修改
  • 常见问题的解决方案

通过这个基础插件,可以进一步扩展实现更复杂的功能,如更精细的JS内容修改、请求/响应拦截等安全测试相关功能。

BurpSuite插件编写入门教程 1. 背景与需求 本教程旨在指导如何编写BurpSuite插件,特别是针对修改JavaScript响应内容的需求。作者在实际渗透测试中发现,通过Hook前端危险函数并查找同级或上级过滤函数的方法很有价值,但遇到了"use strict"模式导致 callee.caller 无法使用的问题,因此需要开发Burp插件来自动移除JS文件中的严格模式声明。 2. 开发环境配置 2.1 环境准备 Python环境 :需要使用Jython(Java实现的Python) 配置步骤 : 在BurpSuite中配置Python环境路径为Jython的安装路径 确保相关API包与Python脚本同级目录 注意:作者尝试过Java环境打包成可执行JAR,但遇到了依赖问题,最终选择了Jython方案 3. 插件基础结构 3.1 核心接口 Burp插件需要实现以下接口: IBurpExtender :插件入口接口 IHttpListener :HTTP请求/响应监听接口 3.2 基本类结构 4. 核心API详解 4.1 IBurpExtenderCallbacks关键方法 getHelpers() :获取辅助工具对象 getStdout() :获取标准输出 registerHttpListener() :注册HTTP监听器 getParameters() :获取请求参数(仅适用于请求) getHeaders() :获取头部信息 4.2 IExtensionHelpers关键方法 analyzeResponse() :分析响应内容,返回IResponseInfo对象 bytesToString() :字节转字符串 stringToBytes() :字符串转字节 4.3 IHttpRequestResponse 包含完整的请求/响应会话 方法: getRequest() :获取请求内容 getResponse() :获取响应内容 setResponse() :设置响应内容 5. 实现响应内容修改 5.1 处理流程 5.2 处理JS响应 6. 常见问题与解决方案 6.1 环境配置问题 问题 :新版PyCharm/Eclipse不兼容Jython 解决 :直接使用文本编辑器编写,或忍受缺乏语法提示 6.2 API使用误区 误区 :在响应处理中使用 getParameters() 原因 :该方法会移除等号,导致JS语法错误 正确做法 :直接处理原始响应体 6.3 严格模式处理 目前方案只能处理静态的"use strict"声明 动态生成的严格模式声明需要更复杂的处理逻辑 7. 完整代码示例 8. 扩展思路 增强严格模式处理 :使用正则表达式匹配更复杂的严格模式声明 性能优化 :添加缓存机制避免重复处理相同JS文件 错误处理 :添加异常捕获和日志记录 UI集成 :添加配置界面让用户自定义处理规则 9. 总结 本教程详细介绍了如何开发一个能够修改JS响应内容的BurpSuite插件,重点包括: 环境配置和API理解 核心接口的实现 响应内容的分析和修改 常见问题的解决方案 通过这个基础插件,可以进一步扩展实现更复杂的功能,如更精细的JS内容修改、请求/响应拦截等安全测试相关功能。