如何用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!")
关键说明
- 接口实现:必须同时实现
IBurpExtender(扩展入口)和IHttpListener(监听HTTP消息)两个接口,这是Burp扩展的基础要求。 - 请求解析与重构:用Burp提供的
IHelpers工具类来解析请求、构建新请求,能帮你避开手动处理HTTP格式的各种坑,比如换行符、头与体的分隔等。 - 工具过滤:通过
toolFlag参数可以精准判断请求来自哪个模块(比如TOOL_INTRUDER对应Intruder,TOOL_PROXY对应代理,TOOL_REPEATER对应重放等),完全可以根据自己的需求调整过滤规则。 - 调试输出:代码里的
stdout输出可以在Burp的「Extender」->「Output」标签里查看,方便你验证扩展是否正常工作,也能排查修改失败的问题。
使用方法
- 把代码保存为
.py文件(比如ModifyHeader.py)。 - 在Burp中打开「Extender」->「Extensions」->「Add」,选择「Python」作为语言,然后选择你的.py文件,点击「Next」即可加载。
- 之后所有符合条件的请求都会自动修改
Accept-Language头为en。
内容的提问来源于stack exchange,提问作者TheHidden
相关产品推荐
相关产品推荐

