存在于运用层的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等进行绕过。

phpwaf记一次简略的HTTP绕WAF Ruby

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,创造上传成功。

【逐一帮助安全学习,所有资源关注我,私信回答“资料”获取逐一】①网络安全学习路线②20份渗透测试电子书③安全攻防357页条记④50份安全攻防口试指南⑤安全红队渗透工具包⑥网络安全必备书本⑦100个漏洞实战案例⑧安全大厂内部教程

加密绕过

分块传输绕过

如果在HTTP首字部中加入Transfer-Encoding: chunked。
我们就可以利用这个报文采取了分块编码的办法绕过运用层面的WAF。
缘故原由的这时是通过POST要求报文中的数据部分,并对数据进行分块传输。
每个分块包含十六进制的长度值和数据,长度值独占一行,长度不包括它结尾的,也不包括分块数据结尾的,且末了须要用0独占一行表示结束(同时末端须要以两个换行结束)。

小提示:上传失落败的缘故原由是没有分好考块,这种可以在绕过SQL注入或者XSS的时候进行考试测验,不建媾和上图一样对图片马进行考试测验(关键是不好分块,效率低下)。

0X03 首字部Pipeline

众所周知,HTTP协议是由TCP协议封装而来,当浏览器发起一个HTTP要求时,浏览器先与做事器通过TCP协议建立连接,然后发送HTTP 数据包给它,但是这里包含了一个Connection的字段,正常情形下该段的值为close。
而且Apache等Web容器会根据这个字段决定是保持该 TCP 连接或是断开。
当发送的内容太大,超过一个 HTTP 原谅量,须要分多次发送时,值会变成keep-alive,即本次发起的 HTTP 要求所建立的TCP连接不断开,直到所发送内容结束Connection为close时停滞。

0X04 首字部Disposition

Content-Disposition的详细事理:它是WAF的一个规则,针对文件上传紧张是对那个地方去做防护的,以是须要稠浊去绕过!


由于该协议对 PHP 对解析存在毛病、使得如果一行有多个 filename 字段值,则PHP布局的Web Server会取末了的filename值进行解析。
Web Server终极可以得到的文件名是1.php,但是某些WAF只会判新第一个filename的值,因此 WAF 对上传的文件的过滤检测功能会被黑客绕过,并且这里的form-data是可有可无的类型,便是去掉它也不会影响Web Server获取filename的名称(如下所示):

Content-Disposition: form-data; name="file1"; filename="1.txt";filename="1.php";

虽是如此,但filename的编码还会被HTTP要求Content-Type头中charset所影响;Web Server可以根据这个值进行相应的解码处理。
这些都有可能被一些人轻微做点手脚,便可以绕过不少WAF的文件上传过滤检测。
可能有的师傅会说,那怎么测试啊?这个实在就见仁见智了,我常日会自己搭建一个环境进行Fuzzing字典的黑盒测试;如果是代码审计和CTF功底好的师傅,可能就直接测试一些漏洞点了。
以是,这方面大家可以多看看其他师傅写的文章,平时多学习多做条记。

0X05 首字部Typer

Content-Type:一样平常是指网页中存在的Content-Type,用于定义网络文件的类型和网页的编码,决定文件吸收方将以什么形式、什么编码读取这个文件,这便是常常看到一些Asp网页点击的结果却是下载到的一个文件或一张图片的缘故原由。

分外编码绕过

HTTP头里的Content-Type要求头一样平常有application/x-www-form-urlencoded,multipart/form-data,text/plain三种,个中multipart/form-data表示数据被编码为一条,页上的每个控件对应中的一个部分。
当 WAF 没有规则匹配该协议传输的数据时则可被绕过。

利用分外编码对payload进行转义,从而绕过WAF对分外关键词的过滤。
该方法的思路紧张环绕: multipart/form-data进行,紧张针对付 POST 参数的,对付须要在GET参数位置触发的恶意漏洞影响不大。
提及multipart/form-data 的浸染,我们知道HTTP 协议POST要求,除了常规的 application/x-www-form-urlencoded 以外,还有 multipart/form-data 这种形式,便是为理解决上传文件场景的问题下文件内容较大且内置字符不可控的问题而准备的。
multipart/form-data 格式也是可以通报POST参数的。
对付Nginx+PHP的架构,Nginx 实际上是不卖力解析 multipart/form-data 的 body 部分的,而是交由 PHP 来解析,因此 WAF 所获取的内容就很有可能与后真个 PHP 发生不一致。

以 PHP 为例,我们写一个大略的测试脚本:

<?php//用于将文件的内容读入到一个字符串中echo file_get_contents("php://input");//打印显示,一个变量的内容与构造var_dump($_POST);//打印显示,一个变量的类型的信息var_dump($_FILES);?>双写上传描述行绕过

双写全体Part开头绕过

布局假的Part绕过

双写Boundary绕过

布局空Boundary绕过

布局空格+Boundary绕过

双写Content-Type绕过

Boundary+逗号绕过

小提示:Bypass WAF 的核心思想在于,一些 WAF 产品处于降落误报考虑,对用户上传文件的内容不做匹配,直接放行。
事实上,这些内容在绝大多数场景也无法引起攻击。
但关键问题在于,WAF 能否准确有效识别出哪些内容是传给POST数组的,哪些传给POST数组的,哪些传给FILES 数组?如果不能,那我们是否就可以想办法让 WAF 以为我们是在上传文件,而实际上却是在 POST一个参数,这个参数可以是命令注入、SQL 注入、SSRF 等任意的一种攻击,这样就实现了通用 WAF Bypass。

0X06 首字部Filename截断Filename绕过

首先将原始的带有脏数据的 payload 转换成文件上传包格式的协议:multipart/form-data,然后进行截断,如下图所示:

以上环境并未演示到其余一种基于 HTTP 协议特性绕过 WAF 的方法(实际上是基于 “协议未覆盖绕过” 方法,属于它的升级改造版)——filename 文件名稠浊绕过。
下面直接识破绽银行大佬在视频中的实战利用演示。

空格+filename绕过

为了让 Payload 能够顺利解析,可以在 fliename="1.jpg"的等号前面添加空格,让 fliename 文件名无法解析,从而使得后面的php参数可被做事器解析实行,终极达到绕过 WAF 同时实行 pqyload 注入的目的:

双引号+filename绕过

其余此处也可以在 filename 前方添加双引号,也可以实现上述实行 payload 的目的:

0X07 小结

通过上述学习,我们知道了关于HTTP首字部的一些知识点,进而通过利用该首字部的特点进行Fuzzing,终极达到绕过WAF的目的。
当然上述结论难免存在不敷,希望师傅们斧正。
经由这几天的资料查找,我创造这些东西在CTF领域的研究,以及达到了至高无上的地步。
而且我们真正的去理解这些东西,可能须要节制好一门措辞和对HTTP协议有所理解(导致我的阐明可能过于牵强dog),希望大家不要介意!