内容简介:分块传输绕WAF在年初的我们先来看看插件要实现的功能限于边幅,我只说明核心函数,并通过注释的方式解释代码的相关功能。
分块传输绕WAF在年初的 《利用分块传输吊打所有WAF》 中学习到了,不过没有深入研究。最近在T00ls上看到大佬们在编写sqlmap的tamp脚本,过程中遇到了比较难解决的一个问题,对sqlmap数据包加入 Transfer-Encoding: chunked
HTTP头。本周尝试通过编写Burp插件来解决这个问题,同时也为了方便在Burp上快速测试分块传输是否能绕过waf。我们开始吧!
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-conveter
0x03 效果演示
3.1 演示一:快速编码解码
在Burp repeater套件可以快速对请求内容进行chunked编码解码,来对WAF进行测试。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- HTTP 响应的分块传输
- 利用分块传输吊打所有WAF
- 从零开始学算法:6.链表与分块
- 从零开始一个文件分块上传【后端为Golang】
- 【火炉炼AI】机器学习037-NLP文本分块
- Flutter-Http分块下载与断点续传
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
ACM图灵奖演讲集
阿申豪斯特 / 苏运霖 / 电子工业出版社 / 2005-4 / 55.0
本书完整地收录了这些演讲,并配之以部分获奖者撰写的后记,旨在反映过去数年来这一领域中发生的变化。对任何一位计算机科学的历史与发展有兴趣的人来说,本书都极具收藏价值。 本文收录了自图灵奖开始颁发的1966年起到1985年这20年间图灵奖获得者在授奖大会上所做演讲的全文。由于在此期间有三次是把奖项同时授予两个人的,而其中有两次两位获奖者分别做了演讲,因此一共收录了22篇演讲稿。本书把这些演讲分为两大......一起来看看 《ACM图灵奖演讲集》 这本书的介绍吧!