ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

编写Burp分块传输插件绕WAF

2021-02-23 11:04:59  阅读:197  来源: 互联网

标签:body 编码 插件 encoding WAF request 套件 Burp


0x01 功能设计

我们先来看看插件要实现的功能

在Burp Repeater套件上可对数据包进行快速chunked解码编码
自动化对Burp的Proxy,scanner,spider等套件的数据包进行编码
可设置分块长度,是否开启注释

0x02 编写代码

限于边幅,我只说明核心函数,并通过注释的方式解释代码的相关功能。
2.1 编码函数

这是我们的核心函数,对各个套件数据HTTP数据进行chunked编码

public static byte[] encoding(IExtensionHelpers helpers, IHttpRequestResponse requestResponse, int split_len, boolean isComment) throws UnsupportedEncodingException {
byte[] request = requestResponse.getRequest();
IRequestInfo requestInfo = helpers.analyzeRequest(request);
int bodyOffset = requestInfo.getBodyOffset();
int body_length = request.length - bodyOffset;
String body = new String(request, bodyOffset, body_length, “UTF-8”);
// 对长度大于10000的数据包,不处理
if (request.length - bodyOffset > 10000){
return request;
}

//对数据包进行编码处理
List<String> str_list = Util.getStrList(body,Config.splite_len);
String encoding_body = "";
for(String str:str_list){
	if(Config.isComment){
		encoding_body += String.format("%s;%s",Util.decimalToHex(str.length()),Util.getRandomString(10));
	}else{
		encoding_body += Util.decimalToHex(str.length());
	}
	encoding_body += "\r\n";
	encoding_body += str;
	encoding_body += "\r\n";
}
encoding_body += "0\r\n\r\n";

//在数据包中添加Transfer-Encoding: chunked头
List<String> headers = helpers.analyzeRequest(request).getHeaders();
Iterator<String> iter = headers.iterator();
while (iter.hasNext()) {
	if (((String)iter.next()).contains("Transfer-Encoding")) {
		iter.remove();
	}
}
headers.add("Transfer-Encoding: chunked");
return helpers.buildHttpMessage(headers,encoding_body.getBytes());

}

自动编码其他模块的数据包,我们可以通过实现Burp的IHttpListener,IProxyListener这两个接口,分别实现processHttpMessage(),processProxyMessage()这两个方法。

这里注意一个问题,Burp的所有模块的HTTP流量都会经过IHttpListener.processHttpMessage()这个方法,但是如果在这里处理数据包的话,Burp Proxy模块的数据包被修改之后,不会在Proxy套件UI界面显示修改后的流量,故Proxy模块流量处理单独使用IProxyListener.processProxyMessage()。
2.2 自动编码Proxy套件的流量

@Override
public void processProxyMessage(final boolean messageIsRequest, final IInterceptedProxyMessage proxyMessage) {
if(messageIsRequest && isValidTool(IBurpExtenderCallbacks.TOOL_PROXY)){
IHttpRequestResponse messageInfo = proxyMessage.getMessageInfo();
IRequestInfo reqInfo = helpers.analyzeRequest(messageInfo.getRequest());
//只对Content-Typt头为application/x-www-form-urlencode的POST包进行编码
if(reqInfo.getMethod().equals(“POST”) && reqInfo.getContentType() == IRequestInfo.CONTENT_TYPE_URL_ENCODED){
try {
//使用encoding方法对原请求包进行chunked编码
byte[] request = Transfer.encoding(helpers, messageInfo, Config.splite_len,Config.isComment);
if (request != null) {
//将原HTTP请求包替换为chunked编码后的请求包
messageInfo.setRequest(request);
}
} catch (Exception e) {
stderr.println(e.getMessage());
}
}
}
}

2.3 自动编码Proxy之外的套件(Intruder,scanner…)流量

@Override
public void processHttpMessage(int toolFlag, boolean messageIsRequest, IHttpRequestResponse messageInfo) {
//Proxy套件流量不处理,否则会出现两次编码问题,其余套件均在这里处理。
if(messageIsRequest && isValidTool(toolFlag) && (toolFlag != IBurpExtenderCallbacks.TOOL_PROXY)){
IRequestInfo reqInfo = helpers.analyzeRequest(messageInfo.getRequest());

	if(reqInfo.getMethod().equals("POST") && reqInfo.getContentType() == IRequestInfo.CONTENT_TYPE_URL_ENCODED){
		try {
			byte[] request = Transfer.encoding(helpers, messageInfo, Config.splite_len,Config.isComment);
			if (request != null) {
				messageInfo.setRequest(request);
			}
		} catch (Exception e) {
			stderr.println(e.getMessage());
		}
	}
}

}

完整的代码,已经上传github,地址如下:
http://github.com/c0ny1/chunked-coding-converter
0x03 效果演示
3.1 演示一:快速编码解码

在Burp repeater套件可以快速对请求内容进行chunked编码解码,来对WAF进行测试。

快速编码解码对WAF进行测试
3.2 演示二:搭配sqlmap进行sql注入

sqlmap代理到Burp中,插件对Proxy套件的流量进行编码处理,来绕过waf。

搭配sqlmap绕waf
0x04 参考文章

利用分块传输吊打所有WAF
在HTTP协议层面绕过WAF

引自c0ny1师傅的文章,多多学习,如有冒犯,请联系删除

转载请注明:Adminxe’s Blog » 编写Burp分块传输插件绕WAF

标签:body,编码,插件,encoding,WAF,request,套件,Burp
来源: https://blog.csdn.net/leshi182/article/details/113976972

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有