成对的数据流处理经验

目录


HTTP数据都是成对的,一个request对应一个response. 下面介绍怎么从数据流(回调方式)中处理这种数据。

Burp的插件开发,调用的接口是一个回调函数——processHttpMessage,它可以接收请求,拦截请求,修改请求,拿到整体的请求和响应。

问题总结:

  1. 数据流顺序不确定:正常的“请求-响应”顺序可能被打乱,例如出现 12121122 这样的序列。
  2. 需要状态缓存:因为回调是“无状态”的,必须自己维护一个缓存,来暂存先到达的请求,等待其对应的响应到达后,再将两者“配对”处理。

代码思路:

  1. 在得到request的时候,不做处理;
  2. 在得到response的时候,一并将request和response一起存储,并传递出去;

案例

Burp插件开发举例:

    // 定义两个Map,一个存储单独的请求,一个存储请求-响应对
    private Map<String, IHttpRequestResponse> requestCache = new HashMap<>();
    private Map<String, Pair<IHttpRequestResponse, IHttpRequestResponse>> fullRequestResponse = new HashMap<>();

    /**
     * 功能: 监听HTTP proxy模块的流量,根据配置去做匹配,并高亮显示
     *
     * @param i                    —— 区分什么是什么Burp模块过来的数据;
     * @param b                    —— boolean b(messageIsRequest)这个参数是用来判断当前传入的messageInfo对象是HTTP请求还是HTTP响应;
     * @param iHttpRequestResponse —— 一个结构体,存储了请求和响应属性;
     */
@Override
public void processHttpMessage(int i, boolean b, IHttpRequestResponse iHttpRequestResponse) {
    if (b) { // 是请求
        // 可以不做任何事,或者仅做记录
    } else { // 是响应
        // 直接从 IHttpRequestResponse 对象中提取请求部分
        IHttpRequestResponse request = iHttpRequestResponse; 
        // 注意:在响应回调中,iHttpRequestResponse 本身就包含了请求和响应
        // 您可以直接使用 iHttpRequestResponse 来获取请求数据
        // byte[] requestBytes = iHttpRequestResponse.getRequest();
        // byte[] responseBytes = iHttpRequestResponse.getResponse();
        // 然后进行配对处理
    }
}
posted on 2024-03-05 16:05  Mysticbinary  阅读(79)  评论(0)    收藏  举报