原创干货 | HTTP协议绕过某硬件WAF剖析
Posted 云众可信
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了原创干货 | HTTP协议绕过某硬件WAF剖析相关的知识,希望对你有一定的参考价值。
听说转发文章
会给你带来好运
目前,市场上的waf的种类繁多,这里就waf在网络中所处的位置做一个大致的分类:
1、waf部署在业务之前,根据业务所处的内外网环境的不同可以分为云waf和硬件waf;大多数的云waf,其优点为:部署简单、维护成本低,同时可以充当cdn的角色,规则更新快,缺点为:容易被绕过,如果黑客找到服务器的真实ip那么绕过云waf将变得轻而易举,由于所有流量经过waf所以可能一部分对保密性要求较高的业务存在信息泄漏的风险。大部分的硬件waf,其优点为:部署简单即插即用,waf在放入机房后,便可实现安全防护,由于其一般为独立的设备所以稳定性较好,缺点为:价格昂贵,一台一般的waf设备价格往往十万上百万,和云waf一样硬件waf也存在被绕过的可能。
2、waf和业务部署在同一服务器上,这一类的waf的优点:价格一般比较便宜甚至免费,除了常规的waf功能之外往往还集成了其他木马扫描、防扫描等功能,但是由于其与业务共生的特性,其缺点也比较明显了:占用正常的业务运算资源,也存在被绕过的可能。
Waf绕过是一个老生常谈的问题,大概的绕过思路有以下几种:
1、利用waf部署上的架构缺陷去bypass,
2、利用HTTP协议层的缺陷进行bypass,
3、利用数据库层面的缺陷绕过。
首先,看看第一个,架构上的缺陷绕过,这里提供几个思路:
1、如果是云waf,并且后端业务没有严格限制访问的来源的话,那么去寻找业务的真实ip将会是比较优的bypass方法。
2、如果是waf集群的话ddos是一种不错的选择,在把waf的性能达到阈值之后就有直接联通业务的可能比如比较著名的正则ddos-https://www.owasp.org/index.php/Regular_expression_Denial_of_Service_-_ReDoS,这里不是很推荐这种方法,因为黑盒测试还是以尽量小的影响业务为主。
3、利用waf和业务对sslciphersuite支持的差异性bypass,如果确实发现目标使用了https的话这种是比较好的方法,找到一种业务支持但是waf不支持的加密算法就可以bypass了,相关工具:https://github.com/LandGrey/abuse-ssl-bypass-waf
利用HTTP协议的缺陷绕过:
1、请求方式,有可能waf只拦截了GET方式发送的请求,
2、请求变体,通过burpsuite的changebody encoding功能来将post的数据以form-data的形式发送,如果waf没有检查这一部分的内容那么将会绕过waf
3、参数污染,当我们向服务器提交多个相同的参数时,不同的web服务器获取到的web的是不一样的,下面针对以下的请求
id=1&id=2&id=3
不同的服务器环境所取得的参数
Asp.net+ iis:id=1,2,3
Asp+ iis:id=1,2,3
Php+ apache:id=3
所以当waf与web服务器获取参数的机制不一样时也会造成bypass
4、和参数污染一样不同的服务器对http可能某一些字符还有着不同的处理,比如iis+asp的%特性,iis会把s%elect理解为select从而绕过waf
%u特性,iis支持unicode解析,会把s%u006c%u0006ect解析为select,waf识别的内容还是s%u006c%u0006ect,从而绕过waf
这一部分其实很大一部分取决于对中间件及waf的理解,详细的中间件版本和测试情况可见:https://drive.google.com/file/d/0B5Tqp73kQStQU1diV1Y0dzd1QU0/view
数据库层绕过waf,这一层面属于和waf的防护规则硬碰硬,也有很多关于这一方面的文章,但是一般都不具有通用性并且很快会被waf厂商封禁。其原理就是利用数据库或者系统语句的多变性,将存在于waf规则中的特殊函数或者字符使用其他的函数或者字符进行替代来达到绕过的目的,由于规则太多不能一一介绍,这里简单介绍几个:相同作用的如mid(@@version,1,1)和substring(@@version,1,1)如果waf过滤了逗号我们也可以换一种写法mid/substring(@@versionfrom 1 for 1)。空白字符%09,%0a,%0b,%0c,%0d,%a0。使用casewhen语句替代if语句,或者使用andxxx=xxx and sleep(1),and运算的短路逻辑来替代if语句等等等。具体的细节可参照blackhat 2016的议题https://www.slideshare.net/einstais/another-brick-off-the-wall-deconstructing-web-application-firewalls-using-automata-learning
不幸的是,在上述方法出现之后很大一部分都被waf厂商所修复,上述方法在实战中有很大的可能性是绕不过去waf的,在18年有两篇关于waf绕过的文章,都不是去对waf进行fuzz的,而是从http协议层进行绕过,这样的方法往往成本较低而且具有通用性,这两篇文章提到的一个共同点就是利用分块传输Transfer-Encoding:chunked来绕过waf。
首先我们来看看什么是分块传输,一般向服务器发送请求的头中都会包含请求body的大小,也就是content-length,但是如果是body比较大那么可能需要把body写到一个比较大的数组里之后才能计算出content-length,利用Transfer-Encoding:chunked就可以在服务器和客户端之间做一个分块的约定,然后使用分块传输。
下图截取自http权威指南,如图首先声明Transfer-Encoding:chunked,其次每一块的第一行为该分块的大小,最后一块为两个空行代表数据包结束,拖挂为可选。
利用chunked我们可以将一些关键字比如and拆开绕过waf
或者通过在分块第一行表明分块长度的位置加入“;xxxx“这种注释的方式也可以绕过waf
1.漏洞发现
在一个项目的测试过程中,发现了一个sql注入,如图1-1所示,在参数后面加入单引号’报错,在加入’--后正常回显,如图图1-2
图1-1测试发现漏洞
图1-2加入’--后正常
2.漏洞分析
可以发现在加入'、'--之后出现了不同的响应这里存在一个报错注入,可是当我们输入'and 1=1这类布尔型语句时,服务器不对我们做出任何的响应,并且封掉了我们的ip。
3.漏洞跟踪
通过反查域名的ip时我们发现了某硬件安全设备,初步判断有安全设备进行防护。
4.http协议绕过原理
接下来我们谈谈怎么突破这个waf来进行注入,首先我们要排除的是进行fuzz,因为这台安全设备的特性是封锁ip,所以fuzz所需要的ip对我们来说成本太大了,免费的代理速度又太慢。于是思路是直接绕过安全设备。
首先,我们来想象一下这种硬件安全设备的网络结构
这么一看,这台waf作为打通内外网的路由设备,似乎绕过云waf直接访问ip的方法或许不太可行,由于网站没有使用https,那么滥用sslcipher suite的方法也是不可行的,那么我们是不是躲不开这台waf了必须和他硬碰硬呢?
当然不是的,首先就我的观点来看,绕过waf的方法大概有这么几种:
1、从架构层去绕过,比如说之前提到的直接去访问waf背后服务器的真实ip那就是从架构层面去绕过云waf的手段。
2、从协议层面绕过,比如说利用waf和后端服务器支持不同的sslciphersuite算法,那么我们可以选择一种后端支持而waf不支持的算法来通讯达到绕过的目的,之前提到的滥用ssl就是这种方法。
3、代码层的绕过,其实说白了waf的防御无非是拦截请求、匹配规则,这其实也就是fuzz出来一些畸形字符可以绕过规则的同时顺利的去执行语句。
5.http协议具体绕过方法
这就要说到今天的标题http协议了,为什么http协议可以绕过waf,waf的http实现和后端服务的实现有所不同,导致某些的协议可以绕过,这其实也是一个成本博弈的过程,waf如果只是为这一个网站适配的那当然可以面面俱到,但是面面俱到的成本太高了,所以绕过的方法就是滥用一下http,因为http协议的定制者面对新增http的功能、和修补旧的缺陷这两者的选择时往往选择的是前者,所以为我们留下了很多有意思的tricks。
1.Content-Type
首先我们看一个有趣的http头,Content-Type实体头,常见出现在响应包的头部,其实这个头还可以出现在请求中用以编码请求的数据,如果waf没有对这部分编码的数据做处理,这样我们就可以用编码后的数据来绕过许多waf了,这一点在appsec会议上SoroushDalili也有提及,并且借助SoroushDalili开发的burp插件(https://github.com/nccgroup/BurpSuiteHTTPSmuggler)我们可以很轻松的用burpsuite做到这一点,利用这一点我们可以轻松的bypass这台硬件设备
And1=1不再拦截
And1=2 报错
爆出用户名
点到即止,不做深入测试
2.Keep-alive
再另外一个就是最近很火的Connection:keep-alive了,《利用分块传输吊打所有WAF》、《在HTTP协议层面绕过WAF》这两篇文章中也有提到,其实这个请求头除了用来绕过waf之外,这个头还可以用来加速扫描器的扫描速度,这一点JamesKettle在Bugcrowd在线会议上也有提及并且开发了一个非常棒的工具TurboIntruder(https://portswigger.net/blog/turbo-intruder-embracing-the-billion-request-attack),究其原因持续性连接在节省频繁的http连接、断开的操作节省服务器资源的同时也提高了扫描的速度,如果waf没有考虑到持续连接的情况,那么同一页中的后续数据包将绕过waf,我们来操作一下。
从图中可以发现时指出keep-alive的,接下来我们就可以在后续的数据包中加入payload绕过waf了
传统代码加密的方式在新型WAF防火墙上可以轻易的被拦截和防范,而针对协议层面的绕过攻击刚刚开始,本文中使用的两种方法均可以有效的绕过,关于http的理解更深的话可以发现更多有意思的绕过方法,在协议层去绕过waf可以避免很多与waf的对抗,降低攻击的成本。
原创文章未经授权禁止转载,谢谢合作
●
●
●
●
·END·
原创·干货·一起玩
以上是关于原创干货 | HTTP协议绕过某硬件WAF剖析的主要内容,如果未能解决你的问题,请参考以下文章