You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python/Jython开发Burp扩展修改所有或Intruder请求头

实现Burp扩展修改请求头(全模块/仅Intruder)

没问题,我刚好做过类似的需求,用Jython开发Burp扩展来修改请求头其实很直观,核心是利用Burp的IHttpListener接口来拦截并处理请求。下面给你两种方案:一种是修改所有模块发出的请求,另一种是仅针对Intruder模块的请求,你可以按需选择。

核心思路

Burp的IHttpListener会监听所有进出的HTTP消息,我们只需要在请求发送给服务器前,拦截并修改指定请求头即可。如果要限定仅Intruder,可以通过判断请求的origin参数来过滤。

完整代码示例

方案1:修改所有模块的请求头

from burp import IBurpExtender
from burp import IHttpListener
from java.io import PrintWriter

class BurpExtender(IBurpExtender, IHttpListener):
    def registerExtenderCallbacks(self, callbacks):
        # 设置扩展名称
        callbacks.setExtensionName("Modify Accept-Language Header")
        # 注册HTTP监听器
        callbacks.registerHttpListener(self)
        # 初始化输出流(方便调试)
        self._stdout = PrintWriter(callbacks.getStdout(), True)
        self._stderr = PrintWriter(callbacks.getStderr(), True)
        self._callbacks = callbacks
        self._helpers = callbacks.getHelpers()
        self._stdout.println("Extension loaded successfully!")

    def processHttpMessage(self, toolFlag, messageIsRequest, messageInfo):
        # 只处理请求,忽略响应
        if not messageIsRequest:
            return
        
        # 获取请求的原始字节数组
        request_bytes = messageInfo.getRequest()
        # 解析请求为IRequestInfo对象,方便操作
        request_info = self._helpers.analyzeRequest(messageInfo.getHttpService(), request_bytes)
        
        # 获取请求头列表
        headers = list(request_info.getHeaders())
        # 标记是否找到Accept-Language头
        found = False
        
        # 遍历修改Accept-Language头
        for i in range(len(headers)):
            if headers[i].startswith("Accept-Language:"):
                # 替换值为en
                headers[i] = "Accept-Language: en"
                found = True
                break
        
        # 如果没找到,也可以选择添加这个头(可选)
        if not found:
            headers.append("Accept-Language: en")
        
        # 获取请求体(如果有的话)
        body_bytes = request_bytes[request_info.getBodyOffset():]
        # 重新构建请求
        new_request = self._helpers.buildHttpMessage(headers, body_bytes)
        # 设置修改后的请求回messageInfo
        messageInfo.setRequest(new_request)
        
        # 调试输出(可选)
        self._stdout.println(f"Modified request from tool: {self._callbacks.getToolName(toolFlag)}")

方案2:仅修改Intruder模块的请求头

只需要在processHttpMessage方法里加一个判断,过滤出Intruder的请求即可:

def processHttpMessage(self, toolFlag, messageIsRequest, messageInfo):
        # 只处理Intruder的请求
        if not messageIsRequest or toolFlag != self._callbacks.TOOL_INTRUDER:
            return
        
        # 以下逻辑和方案1完全一致
        request_bytes = messageInfo.getRequest()
        request_info = self._helpers.analyzeRequest(messageInfo.getHttpService(), request_bytes)
        
        headers = list(request_info.getHeaders())
        found = False
        
        for i in range(len(headers)):
            if headers[i].startswith("Accept-Language:"):
                headers[i] = "Accept-Language: en"
                found = True
                break
        
        if not found:
            headers.append("Accept-Language: en")
        
        body_bytes = request_bytes[request_info.getBodyOffset():]
        new_request = self._helpers.buildHttpMessage(headers, body_bytes)
        messageInfo.setRequest(new_request)
        
        self._stdout.println("Modified Intruder request!")

关键说明

  1. 接口实现:必须同时实现IBurpExtender(扩展入口)和IHttpListener(监听HTTP消息)两个接口,这是Burp扩展的基础要求。
  2. 请求解析与重构:用Burp提供的IHelpers工具类来解析请求、构建新请求,能帮你避开手动处理HTTP格式的各种坑,比如换行符、头与体的分隔等。
  3. 工具过滤:通过toolFlag参数可以精准判断请求来自哪个模块(比如TOOL_INTRUDER对应Intruder,TOOL_PROXY对应代理,TOOL_REPEATER对应重放等),完全可以根据自己的需求调整过滤规则。
  4. 调试输出:代码里的stdout输出可以在Burp的「Extender」->「Output」标签里查看,方便你验证扩展是否正常工作,也能排查修改失败的问题。

使用方法

  1. 把代码保存为.py文件(比如ModifyHeader.py)。
  2. 在Burp中打开「Extender」->「Extensions」->「Add」,选择「Python」作为语言,然后选择你的.py文件,点击「Next」即可加载。
  3. 之后所有符合条件的请求都会自动修改Accept-Language头为en。

内容的提问来源于stack exchange,提问作者TheHidden

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:30:21