吴卓群:应用防火墙(WAF)绕过测试技术
【IT168 资讯】11月3日,以“深度解读应用及业务安全”为主题的OWASP 2012中国峰会在深圳博林诺富特酒店召开。本届大会从多方面、多角度诠释基于因特网、无线电话网和物联网的应用、融合及业务方面的安全,并围绕应用及业务安全发展方向和威胁增长趋势等方面,进行深层次的探讨。
以下是安恒信息信息安全服务部副总监吴卓群《应用防火墙(WAF)绕过测试技术》的演讲:

安恒信息信息安全服务部副总监吴卓群
演讲PPT下载:http://wenku.it168.com/d_000617409.shtml
我介绍一下怎么样去绕过WAF的防护,我分三块东西来讲,第一个是WAF目前的现状;第二个是WAF协议处理的手段;第三个是主要的东西怎么去绕过。
我们看一下现在的WAF的现状。我们经过测试WAF就发现不管是硬件还是WAF,包括国内国外95%以上都可以完全绕过,我这边不考虑软件的WAF,因为软件WAF跟我后面测试不是非常相关。我后面讲到这个测试手段有一个前提,我们的WAF解析协议的方式跟我们中间的解析是有差异的,我们就通过差异去绕过我们的WAF。
我把WAF分为两块。第一块叫做IPS模式,它的做法就是对7层协议全部进行重新解析。根据WAF的反映情况,第一部分是最常见的,通过策略缺陷去绕过WAF,这边不详细介绍这块。第二块因为WAF不同构架导致的问题。很多情况下IPS对分片处理有两种处理,直接对分片包就丢掉,有些就是出现分片包不处理,还有就是发现没有问题就不去检测了。因为他是基于更底层的,基于TCP层或IP层去检测,那这种情况下把数据包分片把一些攻击特征分开以后然后提交上去,提交上去以后我们的操作系统会进行数据重组,重组完之后可以绕过IPS类型的防护就是那种WAF。如果我们的Content-lENGTH非常大,这三个包bypass就被Pass掉了,然后解码能力比较弱,代理模式他的绕过方式,因为要做代理,处理性能可能会降低,我们可以利用高并发量导致他的系统性能受不了,因为在这种情况下,一旦并发量高度以后他们都受不了发生了以后很多有自我保护机制做一个bypass操作,bypass以后那这些策略就完全不生效了,就跟没有WAF一样。另外一个就是解析方法的差异,另外一部分就是解析的方法我这里非常多,我们一个个来看第一个利用编码,这在测试云WAF的情况下的问题,就是在正常情况下,我们通过一个字母或者我们常看见的测试语句,我们通常会用这个去进行测试,正常发过去他是会拦截的,我们用%20也是可以防护住的,然后它没有考虑到UIK(音)的编码,我们只需要把它做成UIK(音)的编码,它就可以绕过去了,就直接通过这种手段%u00,后面其实也是一个%u00编码值,他就能够可以做到一个彻底的一个绕过,只要编码的这些参数就完全不受这些防护策略的影响。第二种就是作为一个截断处理,这个是什么概念?因为实际上大部分的WAF在做策略匹配的时候都是采用正则去处理,如果在我们处理中有一些截断字符出现在里面,就会导致正则的匹配失败,因为后面的截断掉了,就会导致策略失败。这里面有些处理的手段怎么处理的,这里面有一个POST数据包,我们随便在前面加一个参数,如果不影响WAF的话实际上不影响我们的服务器,然后我们再随便加一个后面加%00,[%0a]然后WAF做一个解析,做完以后他会做解码,直接做编码的请求肯定有问题,一做解码就变成ascii00,但是中间件做解析的时候,他不是以字符串的形式去解析我们SPD解析,我们做这个时候就会导致后面的参数截断掉,因为截断了匹配不到正则就导致WAF的策略。
第二个是重复变量的绕过,有些WAF在处理我们的请求时,第一个他会先去把这些变量分割,第一个变量分割以后存到一个缓存里面再去处理第二个,他发现第二个和第一个一样的,他做了一个覆盖,实际上WAF做检测的时候做了第一个变量的检测而没有做第二个变量的检测。而实际上中间件做第一个检测,或者做几个逗号分割的,这种情况下也相当于可以绕过了WAF的检测,这个也是一个我们原来在测试的时候发现的一个问题,在这个请求里面我们有两个相同的变量。第一个请求参数,第一个参数usemame%00第二个也是但没有%00,因为他做参数的时候会做解码,怕你的参数做一些编码的攻击。所以它去做解码,解码的结果导致这个后面%00变%u00,%u00他就认为第一个参数和第二个参数是相同的。第一种情况是他去对第一个参数进行检测,这种情况所以他就对第二个不去做检测。而实际上我们的攻击就在第二个参数里面,然后中间件不认为这样,中间件认为usemame是一个参数,这样他就认为是两个参数,这样就可以又一次地绕过WAF的检测,这个可以用空格去代替、有些是%00去代替,因为有些是去空格操作的,所以这样代替以后其实中间件并不相同,这个也是非常常见的一个问题。我们的WAF他会去针对域名保护,因为我们保护的站点可能不是一个站点,可能是多个站点或者是虚拟主机,多个站点的情况下他会根据域名去判断,这种情况下我们可以对这些域名实际上就是Host字段,在这个字段里面可以明确确定的,然后Host做检测,WAF没有做匹配的时候,如果没有做很好的处理,我们在WWW.×××.COM后面加个点就可以绕过,看起来是相同的域名,但是实际上并不是新的域名,WAF在他的保护里面并没有绕过,当然还包括它的防护我后面就一个TAB键或者是加一个空格,或者是我在前面加空格,WAF可以保护这个站点,但是这个服务器上只有一个站点,我深知可以把Host字段设为空,也可以绕过。后面一个是针对Content-Type不同的理解,下面的WEB的内容是根据Conten—Type但它不是做全匹配的,他是做前面的那串字符匹配的。然后另外一个是超大数据包,因为WAF会有一个问题防止太大的一些数据包会导致他的处理性能的下降,所以他会有一个检测太大数据包就放过去,所以前面有一个不必要的参数后面就大量的请求,超过他的处理长度直接又bypass掉了。
另外一个变换变量位置绕过,我们原来有一个请求,他这个也没有做防护,这个应该是算一个非常大的BUG。利用POST的解析方式的区别,因为POST的解析方式有很多种,可能我们对常见的普通的POST做了解析,但实际上在一些提交文件上传的方式没有做解析,因为这个解析是我们自己去做的,自己去解析POST的请求,在这个情况下我们可以用这种方式去提交,而且服务器也是正常的。还有就是利用对文件字段的一个异常解析,这个什么意思?通常情况下文件里面的内容非常复杂,对于文件的处理我们WAF不做检测的,我们可以利用这样的手段,像这样的请求对于HPS(音)来说我们可以做一个绕过。另外我们还发现有些是对于Ajax的处理是不一样的。还有一个非标准分割符,我们在WAF里面每个符号做请求的时候以换行来做的,但如果我们只是一个回车,就只是一个换行。在做这块解析的时候,就会出现问题,因为我们在处理的时候,并不是按照就这个标准,但中间件不一定按照标准去做。我这边介绍就到这边,谢谢大家!