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 后端逻辑解析

  1. 从请求头获取Hash
  2. 计算请求体的SHA256哈希值
  3. 比较两者是否一致
  4. 一致则返回请求体中的data字段内容
  5. 不一致返回"Invalid signature!"
  6. 无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请求处理逻辑:

  1. 实现HttpHandler接口:处理HTTP请求和响应
  2. 计算请求体哈希:对请求体计算SHA256哈希
  3. 更新请求头:将计算出的哈希值更新到请求头的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 代码解析

  1. 类定义

    • 实现BurpExtensionHttpHandler接口
    • 包含MontoyaApiLogging实例
  2. initialize方法

    • 设置插件名称
    • 注册HTTP处理器
    • 输出加载日志
  3. handleHttpRequestToBeSent方法

    • 处理即将发送的HTTP请求
    • 获取请求体并计算SHA256哈希
    • 创建带有更新后Hash头的新请求
    • 返回修改后的请求
  4. handleHttpResponseReceived方法

    • 处理接收到的HTTP响应
    • 本例中不修改响应
  5. calculateSHA256方法

    • 计算字节数组的SHA256哈希
    • 返回十六进制字符串表示
    • 处理可能的算法不存在异常

5. 插件使用说明

  1. 编译插件

    • 将代码编译为JAR文件
    • 确保包含所有必要的依赖
  2. 加载插件

    • 打开Burp Suite
    • 转到"Extensions"标签页
    • 点击"Add"按钮
    • 选择"Java"类型
    • 浏览并选择编译好的JAR文件
  3. 验证插件工作

    • 拦截或修改任何发送到目标站点的请求
    • 观察插件是否自动更新了Hash头
    • 检查日志输出确认哈希计算
  4. 测试场景

    • 修改请求体内容
    • 确认Hash头自动更新
    • 验证请求能否通过后端校验

6. 扩展功能建议

  1. 配置界面

    • 添加设置界面允许配置哈希算法
    • 允许自定义请求头名称
  2. 性能优化

    • 缓存哈希计算结果
    • 添加条件判断,仅对特定目标应用插件
  3. 错误处理

    • 增强异常处理
    • 添加详细的日志记录
  4. 多算法支持

    • 支持MD5、SHA1等其他哈希算法
    • 根据响应头动态选择算法

7. 总结

本教程详细介绍了如何开发一个Burp Suite插件来自动处理HTTP请求头中的哈希校验问题。通过实现HttpHandler接口,我们能够拦截和修改即将发送的HTTP请求,自动计算请求体的哈希值并更新请求头,从而解决手动操作的繁琐问题。

关键点总结:

  1. 理解目标站点的哈希校验机制
  2. 使用Burp Suite Montoya API处理HTTP请求
  3. 实现SHA256哈希计算逻辑
  4. 自动更新请求头中的哈希值
  5. 通过日志记录插件运行状态

这种自动化方法显著提高了安全测试效率,特别是在需要频繁修改请求的场景下。开发者可以根据实际需求扩展此基础插件,添加更多实用功能。

Burp Suite API插件开发指南:篡改HTTP请求头 1. 场景概述 本教程针对一个常见的Web安全测试场景:目标站点在HTTP请求头中需要一个SHA256哈希值进行校验。如果拦截修改请求后没有重新计算哈希值,请求会被后端拒绝。 1.1 问题描述 目标站点要求每个HTTP请求头包含 Hash 字段 该Hash值是请求体的SHA256哈希值 手动修改每个请求的Hash值效率低下 需要开发Burp Suite插件自动完成这一过程 2. 模拟后端实现 使用Flask框架模拟一个需要Hash校验的后端服务: 2.1 后端逻辑解析 从请求头获取 Hash 值 计算请求体的SHA256哈希值 比较两者是否一致 一致则返回请求体中的 data 字段内容 不一致返回"Invalid signature !" 无Hash头返回"No hash provided." 3. 请求响应示例 3.1 正常请求示例 请求: 响应: 3.2 无效请求示例 请求(修改了请求体但未更新Hash): 响应: 4. Burp Suite插件开发 4.1 插件基础框架 4.2 插件功能实现 我们需要扩展这个基础框架,添加HTTP请求处理逻辑: 实现HttpHandler接口 :处理HTTP请求和响应 计算请求体哈希 :对请求体计算SHA256哈希 更新请求头 :将计算出的哈希值更新到请求头的 Hash 字段 4.3 完整插件代码 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哈希计算逻辑 自动更新请求头中的哈希值 通过日志记录插件运行状态 这种自动化方法显著提高了安全测试效率,特别是在需要频繁修改请求的场景下。开发者可以根据实际需求扩展此基础插件,添加更多实用功能。