WAF分为非嵌入型与嵌入型,

非嵌入型指的是硬WAF、云WAF、虚拟机WAF之类的;嵌入型指的是web容器模块类型WAF、代码层WAF。非嵌入型对WEB流量的解析完全是靠自身的,而嵌入型的WAF拿到的WEB数据是已经被解析加工好的。所以非嵌入型的受攻击机面还涉及到其他层面,而嵌入型从web容器模块类型WAF、代码层WAF往下走,其对抗畸形报文、扫操作绕过的能力越来越强,当然,在部署维护成本方面,也是越高的。

HTTP报文包体的解析

HTTP请求的接收者在接收到该请求时,会关心哪些头部字段,以及会根据这些头部字段做出对request-body进行相应得解析处理。要搞清这些最好还是查看web容器的源码,可以总结为如下:

Transfer-Encoding(Content-Encoding(Content-Type(charset(data))))

Transfer-Encoding

Apache+php对chunked类型的HTTP请求的处理太怪了。RFC2616中说明了,客户端或服务器,收到的HTTP报文中,如果同时存在chunked与Content-Length,则一定要忽略掉content-length(这一点也理所当然,很好理解),而在apache中反而不能缺少。

可以推理出,Apache本身是不支持解析chunked的(对于Apache来说,由于没有解析HTTP请求chunked的代码逻辑,所以一定要从content-length中查看该报文的长度,而chunked可能是被PHP解析了的,所以存在这两个头部一定要同时存在的怪现象)。

这一结论也很好地解释了一些现象,如利用chuncked可以绕过安全狗Apache。通过shodan搜索相关服务器,笔者简单测试一下,关于常见中间件、语言与chuncked的关系有如下参考:

ASPX    PHP    Java

Apache    X    Y

Nginx    Y    Y

IIS    Y    Y

Tomcat    X

那关于chunked,可以有什么利用思路呢?思路一,构造一个chunked请求体,尝试绕过WAF。其中可以涉及到利用chunked本身的一些规范、特性。比如,假如WAF会解析chunked,但加入一些chunked的扩展,WAF就解析不了。反过来,脑洞一下,假如WAF意识到了解析chunked时应该忽略这些扩展,那么在Tomcat下我们是不是可以利用它一下。

利用思路二,解析不一致导致的问题,Apache+PHP对客户端的请求解析十分“良好” 之前落叶纷飞提到的思路 利用分块传输吊打所有WAF

类似还有下面这种

虽然页面返回的是400,但后台都是执行成功了的。

Content-Encoding

它与Transfer-Encoding本质上的区别就是,Transfer-Encoding可以被网络中的各个实体解析并改变,而Content-Encoding在传输过程中不应该、不会被改变的。该字段在Response中比较常见,而在Request中,可能你一辈子都很难遇到。除非运维人员对Web服务器做了相关配置,使得服务器可以识别并解析客户端Request请求的Content-Encoding 头部字段,否则Web服务默认是不会识别该字段的。笔者想尽量写得全一点,虽然这个字段看起来鸡肋、无用,但可以作为一个可能的突破测试点。

Content-Type

Web容器应该不怎么关心Content-Type这个字段,后台语言则会识别该字段并进行对应的数据解析。而我们利用该字段的话,主有从以下思路出发:后台语言会识别哪些类型的Content-Type,这些Content-Type对我们绕WAF有没有用。

PHP默认会处理application/x-www-form-urlencoded、multipart/form-data两种。而JAVA后台对于multipart/form-data类型Content-Type的识别处理,需要借助三方库或是框架,默认情况下是无法处理的,但现在一般都用框架,而框架可能默认情况下就会识别并处理这类型的请求。后台接收到application/x-www-form-urlencoded请求的数据时,会自己解码一次,如果开发人员自己又解码一次或多次,就形成了双重编码、多重编码。对于multipart/form-data,非嵌入型的与模块类型的WAF,都只能自己识别并解析区分字段内容,所以在这一块你可以发挥自己想象,进行各种骚操作来进行绕过,但是,你应该要确认你当前所要绕过的WAF是不是真的做了这块的内容识别。

笔者的意思是说,如果它遇到这种类型Request,只是对Body内容进行全部的规则匹配,而不会解析出其中的表单内容,那你可能就没必要进行那些骚操作了。实际上,有的非嵌入型WAF就是这么“懒”。multipart/form-data的相关骚操作可以参考Protocol-Level Evasion of Web Application Firewalls

Charset

charset是被添加在Content-Type字段后面的,用来指明消息内容所用的字符集,它也仅被后台语言所关心。

• application/x-www-form-urlencoded;charset=ibm037
• multipart/form-data; charset=ibm037,boundary=blah
• multipart/form-data; boundary=blah ; charset=ibm037

JAVA的Servlet默认是接受大多数的charset的,不过正常点的程序员都会设置强制编码。有如下示例:后台代码

请求(Burpsui设置User Options-Character sets-Use a specific ..)

输出

至少可以支持IBM037, IBM500, cp875, and IBM1026字符集的中间件+语言的情况,可以参考下面表格:

溢量数据

曾想到,会不会存在URI数量过多,产生绕过呢?没想到就存在这样的一个CVE,CVE-2018-9230-OpenResty URI参数溢出漏洞。

没关系,思想还在嘛,还存在很多的变形,如通过multipart/form-data的方式来发送数据量比较大的报文,但又属于正常的HTTP请求,按照道理来说,对较上层的WAF(非嵌入型、模块类型)应该会有一定杀伤力的。

下面两个例子之前测试时是通过的,安全狗Apache 3.5版。

或者下面这种方式:

还有很多种方法,比如前面放一个很大的文件,后面再跟Payload表单,是不是也可能可以。

IIS/5.0在处理非application/x-www-form-urlencoded类型content-type的POST请求时,49152字节后面的数据会被截断。上面的HTTP请求,IIS认为1-6为一个请求,7-12为一个请求,13-5为一个请求;而WAF认为1-10,11-15各为一个请求,POST /page.asp?cmd.exe HTTP/1.0被WAF认为是头部字段中的数据,并不会匹配到拦截规则,所以该请求成功绕过WAF。

HTTP协议兼容性

HTTP请求行种的空格

在RFC2616文档中,有说到,HTTP头部字段的构造。

简单点来说就是

Test-Header: Test
等效于(空格替换成\x09)
Test-Header:  Test

在请求行中,也可以这样做(即便RFC2616 5.1节中指明了请求行中只能用空格)。于是,将一个HTTP/1.1的请求变换成如下:

OPTIONS    *   HTTP/1.1
Host:  dest.com

看着可能不明显,但其中的SP都被替换成了HT,而且,SP、HT可以是1到多个,头部字段中SP 、HT可以是零个。常见的web容器都是接受这种HTTP请求的。

HTTP 0.9+Pipelining

发明作者说它用这条技巧来绕过WAF(非嵌入型)对服务器上的一些目录的访问限制。根据本文前面所说,对于嵌入型一类的WAF,是根本不可能利用pipelining来进行绕过的——嵌入型WAF获得的数据的来源是Web容器,web容器识别出这是两个包,对于WAF也是两个包。不过这上面的两点感觉对WAF都没啥用,snort都能识别,那基本上所有WAF厂商都能识别吧。

Websocket、HTTP/2.0

现在越来越多的Web容器都开始支持比较高级的协议了,正常来说,这块不可能不出现新的安全问题的,查看HTTP/2.0 与Websocket的主体内容,未发现有什么利用点。

高层数据

在一个HTTP请求中,诸如json、base64这样的数据,是由后台代码调用相应的解析库来进行解析的,即便是同结构,不同语言不同库也可能存在一些差异。

base64

PHP解析Base64沿袭了其一贯“弱”风格,即便你的字符串含有PHP非法字符串,它也可以成功解析并处理。

测试代码:
echo base64_decode($_POST[‘test’]);

POST提交
test=M#TIzNA==

页面返回
1234

Unicode JSON

在HTTP请求体中传递JSON数据,一般情况下如果网站用的框架,则Content-Type需要指定application/json类型;如果用了三方库,如fastjson,content-type随意即可。可以将尝试将key或vaule替换成\uxxxx的unicode字符。

这里的unicode关联到JSON,只是一个实际的场景,但可以自己发挥。

实体编码 XML

soap之类的协议应该也属于XML类,可以利用这类标记语言的实体编码特性。另外发送请求前考虑一下Content-Type类型。

八进制

还有一个字符表示方式,八进制,如#十六进制的值为23,八进制表示为\43,也是一个可能的点,如在OGNL中就可以使用。

同形字

sqlmap的tamper脚本中有个脚本,将’替换为%ef%bc%87,据说是UTF-8全角字符,但是这种说明没有根本地解释这个问题,笔者也不知道什么环境下产生这种利用条件。直到某一天,看到一篇文章,它们之间似乎存在某在联系——Unicode同形字引起的安全问题,现阶段笔者也只能这样认知这个tamper脚本。有个趣的网站,它已经整理好了,https://www.irongeek.com/homoglyph-attack-generator.php

Char

同形 

命令、SQL语句等

命令注入方面可以利用bash的特性,SQL注入则利用数据库SQL语法特性,各大知名安全网站已经有足够的资料供参考,

容器语言特性

IIS %,在参数中,如果%后面不是符合URL编码十六进制值,就会忽略该%符合,如id=%%20,等价于id=%20。IIS asp 中的GET请求方式提交Body表单,后台可接收。IIS asp的参数污染中,通过,逗号连接污染参数。Tomcat 路径跳转中允许;符号,/..;/..;/。PHP $_REQUEST可以接收cookie中的参数。这块想不到更多的了…

匹配缓冲区大小固定

思考一下,WAF拿到一个数据之后,在对其进行内容匹配时,是不是会将其放入一个固定大小的内存空间中,这个空间的大小是有限的。假设HTTP Request的body部分大小为2333字节,该内存大小为2000字节,那么其核心引擎在做内容匹配时,是不是先处理2000字节,在处理剩下的333字节。至于如何利用,可以发挥自己的想象。

白名单

一个是利用URL中的白名单,如图片、JS等静态资源文件。还可以尝试利用下面这些头部字段

X-Forwarded-For: 127.0.0.1
X-Client-IP: 127.0.0.1
Client-IP: 127.0.0.1

另外可以尝试修改Host头部字段。

输出角度

前面所讲的都是输入角度,这里我们谈谈输出角度。我们在Request中发送Pyaload,会希望从Response的回显或基于时间这些信息通道来获取Payload执行成功后的相关信息。如果存在某种WAF,检测到Response中的回显数据存在敏感信息,Resonse响应包可能就被阻断掉了。(当然,除了基本的回显数据通道,还有基于时间的数据通道)

OOB

遇到这种情况,应对的方法之一就是使用OOB思想来绕过。如XXE OOB、SQL注入OOB、命令注入OOB,等等。

Range

假如页面可能有敏感数据返回,而当前攻击场景又利用不了OOB,你可以尝试使用Range方法来绕过防火墙。普通请求与页面结果:

添加了range,请求获取返回页面0到10的数据:

添加了range,请求获取返回页面10到30的数据:

Range方式应该是所有Web容器默认支持的,这个东西还是有点意思,有点作用。

其他参考

传输层

看CVE时发现的,3whs bypass ids

在三次握手未完成之前,服务端返回了数据,可以造成HTTP流量检测的绕过,该种攻击场景可能是被用于挂马、钓鱼之类的。在链接中给出了对应的PCAP包,可以下载来看看,算是涨见识。在传输层这里,还有一些简单而具备实际意义的操作,比如将一个TCP报文分片成很多很多份,一份几个字节,十几个字节,对端服务器能正常接收,而对非嵌入型的WAF就是一个考验;还有,我们知道,TCP是可靠的协议,那么我们再将这些报文进行   一个合适的乱序,那么是否也可行。

SSL层

对于非嵌入型WAF,在解析SSL数据时,需要该SSL通信端服务器的密钥(非对称)。客户端在与Web服务器进行HTTPS通信时,协商SSL的加密方式可以有很多种,如果其中有一种加密方式恰好是WAF无法识别的,那么WAF就只能睁眼瞎了。Bypassing Web-Application Firewalls by abusing SSL/TLS

DOS

笔者之前了解到,中小公司的防火墙的流量处理能力是很弱的,所以DOS确实可行,算是最后的方案。

其他说明,RFC7230对文章中所说的RFC2616的描述未发生修改。本文参考资料汇总如下:

RCF2616

https://tools.ietf.org/html/rfc2616

Bypassing Web-Application Firewalls by abusing SSL/TLShttps://0x09al.github.io/waf/bypass/ssl/2018/07/02/web-application-firewall-bypass.html

WAF Bypass Techniques  https://2018.appsec.eu/presos/HackerWAF-Bypass-TechniquesSoroush-

Dalili_AppSecEU2018.pptx

Application Security Weekly: Reverse Proxies Using Weblogic, Tomcat, and Nginxhttps://www.acunetix.com/blog/web-security-zone/asw-reverse-proxies-using-weblogic-tomcat-and-nginx/

Protocol-Level Evasion of Web Application Firewalls

https://media.blackhat.com/bh-us-12/Briefings/Ristic/BHUS12RisticProtocolLevelSlides.pdf

Impedance Mismatch and Base64 https://www.trustwave.com/en-us/resources/blogs/spiderlabs-blog/impedance-mismatch-and-base64/

HTTP 协议中的 Transfer-Encoding https://imququ.com/post/transfer-encoding-header-in-http.html

浅谈json参数解析对waf绕过的影响

https://www.exploit-db.com/exploits/44247/

Web Application Firewall (WAF) Evasion Techniques

https://medium.com/secjuice/waf-evasion-techniques-718026d693d8

BypassWAF新思路(白名单) https://www.chainnews.com/articles/774551652625.htm

利用分块传输吊打所有WAF

https://www.cgisecurity.com/lib/HTTP-Request-Smuggling.pdf

对WAF的一些认知的更多相关文章

  1. 如何绕过WAF

    目录 HTTP报文包体的解析 Transfer-Encoding Charset 溢量数据 HTTP协议兼容性 HTTP请求行种的空格 HTTP 0.9+Pipelining Websocket.HT ...

  2. Bypass WAF Cookbook

    PS.之前一直想把零零碎碎的知识整理下来,作为知识沉淀下来,正好借着wooyun峰会的机会将之前的流程又梳理了一遍,于是就有了下文.也希望整理的内容能给甲方工作者或则白帽子带来一些收获. 0x00 概 ...

  3. 语义分析的waf 目前就看到长亭 机器学习的waf有fortnet 阿里云的waf也算

    近期,在全球权威咨询机构 Gartner 发布的 2019 Web 应用防火墙魔力象限中,阿里云 Web 应用防火墙成功入围,是亚太地区唯一一家进入该魔力象限的厂商! Web 应用防火墙,简称 WAF ...

  4. 对抗假人 —— 前后端结合的 WAF

    前言 之前介绍了一些前后端结合的中间人攻击方案.由于 Web 程序的特殊性,前端脚本的参与能大幅弥补后端的不足,从而达到传统难以实现的效果. 攻防本为一体,既然能用于攻击,类似的思路同样也可用于防御. ...

  5. %iowait和CPU使用率的正确认知

    resources 理解 %IOWAIT (%WIO) LINUX系统的CPU使用率和LOAD Linux Performance Observability Tools How Linux CPU ...

  6. 【AI开发第一步】微软认知服务API应用

    目录 介绍 API分类 使用‘视觉’API完成的Demo 点击直接看干货 介绍 从3月份Google家的阿尔法狗打败韩国围棋冠军选手李世石,到之后微软Build2016大会宣布的“智能机器人”战略.种 ...

  7. 深入理解SQL注入绕过WAF和过滤机制

    知己知彼,百战不殆 --孙子兵法 [目录] 0x0 前言 0x1 WAF的常见特征 0x2 绕过WAF的方法 0x3 SQLi Filter的实现及Evasion 0x4 延伸及测试向量示例 0x5 ...

  8. 业务安全通用解决方案——WAF数据风控

    业务安全通用解决方案——WAF数据风控 作者:南浔@阿里云安全 “你们安全不要阻碍业务发展”.“这个安全策略降低用户体验,影响转化率”——这是甲方企业安全部门经常听到合作团队抱怨.但安全从业者加入公司 ...

  9. Imperva WAF使用笔记

    添加IP白名单 在对自己公司网站进行安全测试时会被WAF拦截,如果把WAF彻底停掉就无法拦截到外部的攻击了. 此时可以添加IP地址白名单,白名单内的IP对网站发起扫描时不会做拦截.

随机推荐

  1. Ubuntu 14.04 apache安装配置

    http://jingyan.baidu.com/article/6d704a130c8a0d28da51ca5f.html Ubuntu 14.04 apache安装配置 1.安装 ~# apt-g ...

  2. tk mybatis动态sql中过滤不使用的字段

    实体字段如下 @Data @NoArgsConstructor @AllArgsConstructor @Builder /*** * app图标 */ @JsonFormat public clas ...

  3. (九)UML之活动图

    一.概念 二. 在Rational rose 中画活动图 2.1 创建Activity Diagram 2.2 画图

  4. (四)Centos之查询目录中内容命名ls

    一.查询目录中内容命名ls 1.1 root代表当前登录用户,localhost代表主机名, ~代表当前主机目录,#代表用户权限 #表示超级用户,$表示普通用户: 1.2 查询目录中内容命令 ls   ...

  5. Mac 高效 软件

    彻底卸载软件: cleanmymac 软件转移: AppDelete,选择一个软件归档,换台电脑从归档安装 finder类chrme标签页: XtraFinder

  6. c#操作json数据使用newtonsoft.json

    开源项目提供的一个读取示例 using System; using System.Collections.Generic; using System.IO; using System.Linq; us ...

  7. 【C/C++开发】C++实现简单的线程池

    C++实现简单的线程池 线程池编程简介: 在我们的服务端的程序中运用了大量关于池的概念,线程池.连接池.内存池.对象池等等.使用池的概念后可以高效利用服务器端的资源,比如没有大量的线程在系统中进行上下 ...

  8. 高级UI-符合MD的常用控件

    在Google提供的控件中,在support-design及v4,v7包中,存在着很多符合MD标准的控件,这里罗列出一些常用的控件 TextInputLayout 这个控件在作为输入框的时候是极其方便 ...

  9. FromServices回来

    FromServices回来 起因 这两天,我忽然有点怀念 Asp.NET MVC 5 之前的时代,原因是我看到项目里面有这么一段代码(其实不止一段,几乎每个 Controller 都是) [Rout ...

  10. Mariadb/Mysql命令行常用命令

    一.初始化等 1.登陆数据库方法    mysql -u 用户名 -p 用户密码 2.修改root及用户密码 use mysql; update user set password=password( ...