解决burpsuite报文Filter中无法对中文字符进行过滤的问题

本文最后更新于:13 分钟前

自我放松了好长一段时间,本来想水一水的一篇文章也是咕咕咕到了一个礼拜之后

起因是一个师傅来问我burp的Proxy中,过滤器没法过滤出中文,我心想还有这事

随便访问了下百度,确认有报文响应是包含中文字符”百度”的

然后按照师傅碰到的情况试了下直接过滤,好家伙,真一个没过滤出来

尝试过修改burp的全局编码,还是没办法,问题大概就是burp的请求和响应实际上都是一个个的数据流,bp在显示请求和响应的时候会根据用户设置的选项来编码,也就是第一张图中我们看到的场景,但是当我们在过滤器中试图以中文字符作为条件进行过滤的时候,它未必按照utf-8进行编码,自然就没办法过滤出合适的选项了

当然burp还给我们提供了一个更强大的处理方式,也就是自己编写Bambda表达式

红框中的部分是一个match()方法的实现,而下面我们正是要去自己定义的方法体

中间出了点小插曲,(干啥前还是要思考思考可能的后果,,只能说这一层我当时也没想到直接就炸膛了)

cpu直接干飞到100%,电脑在轰鸣

然后

最后啥也干不了,被迫强制重启(还好Typora开了自动保存)

回到上面的话题!!

红框中的部分是一个match()方法的实现,而下面我们正是要去自己定义的方法体

我们希望请求和响应以utf-8的形式解码,并包含字符串”百度”,思路就是获取请求和响应的原始字节流,然后new String(byte[],”utf-8”)就完事了

那么字节流怎么获取呢?

他已经给我们了一个ProxyHttpRequestResponse的对象作为参数传入了

前面编写过burp插件,所以还是有一定敏感性的,碰到这种情况直接去翻burp提供的接口文档

ProxyHttpRequestResponse给出的接口中,提供了两个方法response()和request()用于分别获取请求和响应

以响应为例,我们跟进HttpResponse,也就是response()接口的返回类型

看到这么个方法,返回响应体并转为字符串

抱着侥幸心理试了下,不出所料

还是老老实实找字节流吧,很快就找到了另一个方法,返回了ByteArray类型的body()接口,虽然ByteArray不是原生的字节类型,但是大概也能猜出个所以然了

很显然,应该跟进ByteArray

不难找到这么个getByte()方法,正是我们一开始需要的原始字节流信息

简单写了个demo:

1
2
3
4
5
if(new String(requestResponse.response().body().getBytes(),"UTF-8").contains("百度"))
{
return true;
}
return false;

成功~

不过还不是很完美,可以看到日志中提示了一些异常

是一个空指针异常,很显然是因为我们的response()返回结果为null,对应的情况就是有一些请求包并没有得到响应

简单做个判断就行

1
2
3
4
5
6
7
8
9
10
HttpResponse response = requestResponse.response();
if(response != null)
{
if(new String(requestResponse.response().body().getBytes(),"UTF-8").contains("百度"))
{
return true;
}
return false;
}
return false;

最终效果