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)
- 配置步骤:
- 在BurpSuite中配置Python环境路径为Jython的安装路径
- 确保相关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. 扩展思路
- 增强严格模式处理:使用正则表达式匹配更复杂的严格模式声明
- 性能优化:添加缓存机制避免重复处理相同JS文件
- 错误处理:添加异常捕获和日志记录
- UI集成:添加配置界面让用户自定义处理规则
9. 总结
本教程详细介绍了如何开发一个能够修改JS响应内容的BurpSuite插件,重点包括:
- 环境配置和API理解
- 核心接口的实现
- 响应内容的分析和修改
- 常见问题的解决方案
通过这个基础插件,可以进一步扩展实现更复杂的功能,如更精细的JS内容修改、请求/响应拦截等安全测试相关功能。