Burp Suite API插件开发指北 | Part 2 篡改HTTP请求头
字数 1563 2025-08-20 18:17:07
Burp Suite API插件开发指南:篡改HTTP请求头
1. 场景概述
本教程针对一个常见的Web安全测试场景:目标站点在HTTP请求头中需要一个SHA256哈希值进行校验。如果拦截修改请求后没有重新计算哈希值,请求会被后端拒绝。
1.1 问题描述
- 目标站点要求每个HTTP请求头包含
Hash字段 - 该Hash值是请求体的SHA256哈希值
- 手动修改每个请求的Hash值效率低下
- 需要开发Burp Suite插件自动完成这一过程
2. 模拟后端实现
使用Flask框架模拟一个需要Hash校验的后端服务:
import flask
from flask import request
from hashlib import sha256
app = flask.Flask(__name__)
@app.route('/', methods=['GET', 'POST'])
def handle_request():
hash = request.headers.get('Hash')
body = request.get_data()
calculated_hash = sha256(body).hexdigest()
if hash is not None:
if str(hash).strip() == calculated_hash:
data = request.form.get('data')
if data is not None:
return data
else:
return "No data provided."
else:
return "Invalid signature!"
else:
return "No hash provided."
app.run(host="127.0.0.1", port=5000, debug=True)
2.1 后端逻辑解析
- 从请求头获取
Hash值 - 计算请求体的SHA256哈希值
- 比较两者是否一致
- 一致则返回请求体中的
data字段内容 - 不一致返回"Invalid signature!"
- 无Hash头返回"No hash provided."
3. 请求响应示例
3.1 正常请求示例
请求:
GET / HTTP/1.1
Host: 127.0.0.1:5000
Connection: keep-alive
Hash: 8897c835cf0001adff74ddf1953bc2f24d36fb3448ec180528ae0640f55f42e0
Content-Type: application/x-www-form-urlencoded
Content-Length: 20
data=Attack+succeed!
响应:
HTTP/1.1 200 OK
Server: Werkzeug/3.1.3 Python/3.12.6
Date: Mon, 23 Dec 2024 03:46:38 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 15
Connection: close
Attack succeed!
3.2 无效请求示例
请求(修改了请求体但未更新Hash):
GET / HTTP/1.1
Host: 127.0.0.1:5000
Connection: keep-alive
Hash: 8897c835cf0001adff74ddf1953bc2f24d36fb3448ec180528ae0640f55f42e0
Content-Type: application/x-www-form-urlencoded
Content-Length: 20
data=Attack+succeed!+1
响应:
HTTP/1.1 200 OK
Server: Werkzeug/3.1.3 Python/3.12.6
Date: Mon, 23 Dec 2024 03:58:26 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 18
Connection: close
Invalid signature!
4. Burp Suite插件开发
4.1 插件基础框架
package arr;
import burp.api.montoya.BurpExtension;
import burp.api.montoya.MontoyaApi;
import burp.api.montoya.logging.Logging;
public class HelloWorld implements BurpExtension {
MontoyaApi api;
Logging logging;
@Override
public void initialize(MontoyaApi api) {
api.extension().setName("Hello World");
this.api = api;
this.logging = api.logging();
this.logging.logToOutput("*** Freebuf.com - Hello World loaded ***");
}
}
4.2 插件功能实现
我们需要扩展这个基础框架,添加HTTP请求处理逻辑:
- 实现HttpHandler接口:处理HTTP请求和响应
- 计算请求体哈希:对请求体计算SHA256哈希
- 更新请求头:将计算出的哈希值更新到请求头的
Hash字段
4.3 完整插件代码
package arr;
import burp.api.montoya.BurpExtension;
import burp.api.montoya.MontoyaApi;
import burp.api.montoya.http.handler.*;
import burp.api.montoya.logging.Logging;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class HashUpdater implements BurpExtension, HttpHandler {
private MontoyaApi api;
private Logging logging;
@Override
public void initialize(MontoyaApi api) {
this.api = api;
this.logging = api.logging();
api.extension().setName("Hash Updater");
api.http().registerHttpHandler(this);
logging.logToOutput("*** Hash Updater loaded ***");
}
@Override
public RequestToBeSentAction handleHttpRequestToBeSent(HttpRequestToBeSent request) {
// 获取请求体
byte[] requestBody = request.body().getBytes();
// 计算SHA256哈希
String hashValue = calculateSHA256(requestBody);
// 创建带有更新后Hash头的新请求
HttpRequest newRequest = request.withHeader("Hash", hashValue);
logging.logToOutput("Updated Hash header to: " + hashValue);
return RequestToBeSentAction.continueWith(newRequest);
}
@Override
public ResponseReceivedAction handleHttpResponseReceived(HttpResponseReceived response) {
// 不修改响应
return ResponseReceivedAction.continueWith(response);
}
private String calculateSHA256(byte[] data) {
try {
MessageDigest digest = MessageDigest.getInstance("SHA-256");
byte[] hashBytes = digest.digest(data);
// 转换为十六进制字符串
StringBuilder hexString = new StringBuilder();
for (byte b : hashBytes) {
String hex = Integer.toHexString(0xff & b);
if (hex.length() == 1) {
hexString.append('0');
}
hexString.append(hex);
}
return hexString.toString();
} catch (NoSuchAlgorithmException e) {
logging.logToError("SHA-256 algorithm not found: " + e.getMessage());
return "";
}
}
}
4.4 代码解析
-
类定义:
- 实现
BurpExtension和HttpHandler接口 - 包含
MontoyaApi和Logging实例
- 实现
-
initialize方法:
- 设置插件名称
- 注册HTTP处理器
- 输出加载日志
-
handleHttpRequestToBeSent方法:
- 处理即将发送的HTTP请求
- 获取请求体并计算SHA256哈希
- 创建带有更新后Hash头的新请求
- 返回修改后的请求
-
handleHttpResponseReceived方法:
- 处理接收到的HTTP响应
- 本例中不修改响应
-
calculateSHA256方法:
- 计算字节数组的SHA256哈希
- 返回十六进制字符串表示
- 处理可能的算法不存在异常
5. 插件使用说明
-
编译插件:
- 将代码编译为JAR文件
- 确保包含所有必要的依赖
-
加载插件:
- 打开Burp Suite
- 转到"Extensions"标签页
- 点击"Add"按钮
- 选择"Java"类型
- 浏览并选择编译好的JAR文件
-
验证插件工作:
- 拦截或修改任何发送到目标站点的请求
- 观察插件是否自动更新了Hash头
- 检查日志输出确认哈希计算
-
测试场景:
- 修改请求体内容
- 确认Hash头自动更新
- 验证请求能否通过后端校验
6. 扩展功能建议
-
配置界面:
- 添加设置界面允许配置哈希算法
- 允许自定义请求头名称
-
性能优化:
- 缓存哈希计算结果
- 添加条件判断,仅对特定目标应用插件
-
错误处理:
- 增强异常处理
- 添加详细的日志记录
-
多算法支持:
- 支持MD5、SHA1等其他哈希算法
- 根据响应头动态选择算法
7. 总结
本教程详细介绍了如何开发一个Burp Suite插件来自动处理HTTP请求头中的哈希校验问题。通过实现HttpHandler接口,我们能够拦截和修改即将发送的HTTP请求,自动计算请求体的哈希值并更新请求头,从而解决手动操作的繁琐问题。
关键点总结:
- 理解目标站点的哈希校验机制
- 使用Burp Suite Montoya API处理HTTP请求
- 实现SHA256哈希计算逻辑
- 自动更新请求头中的哈希值
- 通过日志记录插件运行状态
这种自动化方法显著提高了安全测试效率,特别是在需要频繁修改请求的场景下。开发者可以根据实际需求扩展此基础插件,添加更多实用功能。