编写Burp分块传输插件绕WAF

栏目: 数据库 · 发布时间: 5年前

内容简介:分块传输绕WAF在年初的我们先来看看插件要实现的功能限于边幅,我只说明核心函数,并通过注释的方式解释代码的相关功能。

分块传输绕WAF在年初的 《利用分块传输吊打所有WAF》 中学习到了,不过没有深入研究。最近在T00ls上看到大佬们在编写sqlmap的tamp脚本,过程中遇到了比较难解决的一个问题,对sqlmap数据包加入 Transfer-Encoding: chunked HTTP头。本周尝试通过编写Burp插件来解决这个问题,同时也为了方便在Burp上快速测试分块传输是否能绕过waf。我们开始吧!

0x01 功能设计

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

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

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的 IHttpListenerIProxyListener 这两个接口,分别实现 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-conveter

0x03 效果演示

3.1 演示一:快速编码解码

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

编写Burp分块传输插件绕WAF


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Transcending CSS

Transcending CSS

Andy Clarke、Molly E. Holzschlag / New Riders / November 15, 2006 / $49.99

As the Web evolves to incorporate new standards and the latest browsers offer new possibilities for creative design, the art of creating Web sites is also changing. Few Web designers are experienced p......一起来看看 《Transcending CSS》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

URL 编码/解码
URL 编码/解码

URL 编码/解码