Bootstrap

HTTP绕WAF之浅尝辄止

0X00前言

最近参加重保,和同事闲聊时间,谈起来了外网,彼时信心满满,好歹我也是学了几年,会不少的。结果,扭头看完do9gy师傅的《腾讯 WAF
挑战赛回忆录》,就啪啪打脸了。说来惭愧,最近一段时间,拿到offer就开始飘起来了,现在悔不当初,于是就想写一篇关于这篇Http首部字段文章的"训诂篇"出来,一来当做知识巩固,二来算是完善些和首部字段相关的知识点(可会因为见识不足,导致遗漏)。毕竟,小白可能这方面了解不多,只了解Cookie和Agent这种常见类型的首部字段,却很少听过Accept-
Encoding和Content-Encoding这类不太常用的首字部。

0X01基础知识

关于WAF的问题?

它是我们日常攻防演练必会遇见的,在IOS七层模型中,WAF分为网络层、应用层的,当然还有云
WAF(CDN+WAF)这新型类场景的。不同环境下我们绕过WAF的思路也是有所区别的,例如,对于传统的网络层
WAF,采用chunked编码(即对内容进行所谓的"加密")即可绕过,下次遇见的时候,我们仍然尝试在网络层这一类型上进行尝试和探索。

存在于应用层的WAF,它们的处理引擎是经过前端到达Apache(或者是Nginx)完成
HTTP协议初步解析后,再转交给引擎处理的,这个时候网络层的绕过技术是无效的。这就需要我们去研究:对于一个 HTTP 请求,Nginx
解析了什么内容?交给后面的 PHP、ASP 又解析了什么内容?(探究到这个深度,就需要有良好的编程基础和协议基础,否则,后面及其吃力)。

至于最后的云WAF,我们可以简单的看成CDN加上软件WAF的结合体,既可以抗住DDos攻击,也可以过滤出部分简单的Payload攻击代码,甚至对流量也有一定的清洗作用。

HTTP首部的利用方式?

HTTP 请求头Content-Type的charset编码可以指定内容编码,在国内大多数都是UTF-8编码,但是攻击者在攻击的时候可以替换为
ibm037、 ibm500、cp875等不常用的"偏门"编码来绕过WAF的检测。我们也可以通过设置Content-
Type头的值为application/x-www-form或者multipart/form-
data;charset=ibm500,boundary=blah等进行绕过。

0X02首字部Encoding

关于Encoding,整个名称应该为Accept-Encoding;它在http协议中的作用是可以对内容(也就是body部分)进行编码。Accept-
Encoding:
gzip:表示它可以采用gzip这样的编码,从而达到压缩的目的。这样的话关于网络层的WAF是可以被绕过的,当然我们也可以使用其他的编码把内容搅乱或加密,以此来防止未授权的第三方看到文档的内容。当服务端接收到请求,并且从Header里拿到编码标识时,就可以选择其中一种方式来进行编码压缩,然后返给客户端。

浏览器发给服务器,声明浏览器(客户端)支持的编码类型解释

Accept-Encoding设置在请求头当中,会告诉服务器,我可以接受哪种编码压缩

Content-Encoding设置在响应头中,会告诉客户端,我用的是哪种编码压缩

小提示Encoding的大概意思是:决定文件接收方将以什么形式、什么编码读取这个文件,指定服务器响应的 HTTP
内容类型;这两个header头都会影响服务器对于数据内容的传输格式类型(压缩算法);文章:参考链接

小提示:Accept-Encoding: deflate但发现这种方法已经过时了,我们可以换成Accept-Encoding: gzip

;