You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

101 lines
12 KiB
Markdown

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 20 | WAF如何为漏洞百出的Web应用保驾护航
你好,我是何为舟。
如果你细心观察的话应该会发现随着Web应用越来越多黑客的攻击目标也逐渐转向了针对Web安全的攻击。传统的防火墙主要专注于网络层的攻击防御对Web安全的防御能力相对欠缺。因此WAFWeb Application FirewallWeb应用防护系统的概念也就被提了出来。WAF说白了就是应用网关防火墙的一种它只专注于Web安全的防御近几年来逐渐被当成一个相对独立的产品方向来研究。
那么WAF和防火墙到底有哪些区别呢针对我们之前讲过的各种Web攻击手段WAF是如何提供保护的呢今天我们就一起来看
## WAF的工作模式
前面我说过WAF的本质是“专注于Web安全的防火墙”Web安全关注于应用层的HTTP请求。因此WAF的分析和策略都工作于应用层。
在Web安全这个方向上WAF对比防火墙又做出了哪些改进呢我们可以从WAF的三种工作模式入手探讨这两者的区别。这三种工作模式分别是透明代理、反向代理和插件模式。
**透明代理和大部分防火墙的工作模式相同**在客户端和服务端通信不需要作出任何改变的情况下对HTTP流量进行请求和转发。在这个过程中为了解密HTTPS流量WAF必须和服务端同步HTTPS对称密钥。
![](https://static001.geekbang.org/resource/image/5a/28/5a545133d2e1eee0455a232df595c528.jpg)
透明代理的优点就是容易部署它不需要客户端和服务端进行任何改动。但是透明代理的缺点也有很多。透明代理本身不是一个Web服务所以它无法修改或者响应HTTP的请求只能够控制请求的通过或者拒绝。正因为如此它也无法实现Web服务所提供的认证、内容过滤等功能。
**区别于透明代理反向代理要求客户端将请求的目标地址指向WAF而不是服务端**。在反向代理工作模式中服务端接收的请求实际上也是由WAF发起的。在这个过程中WAF本身就相当于一个Web服务只不过对所有的HTTP请求都进行了转发。
![](https://static001.geekbang.org/resource/image/59/3f/59568304a8a84041838eba9dd52dd63f.jpg)
因为**反向代理WAF本质上是一个Web服务**所以HTTPS证书可以直接部署在WAF上。WAF在对HTTPS流量解密之后就可以在内网中用HTTP的形式向服务端发起代理请求了。
而且反向代理WAF作为一个Web服务能够提供的功能也更加丰富。比如WAF可以充当一个前置的认证平台对所有请求进行身份校验和身份管理。同时也因为在反向代理工作模式中客户端和服务端不直接通信而是将全部请求都先请求到WAF上所以反向代理WAF对服务端的隔离也更加彻底。
但是反向代理同样存在缺点。首先功能更丰富意味着性能开销更大。因此反向代理WAF对硬件要求更高。其次反向代理WAF一旦宕机就无法响应客户端的任何请求。这样一来即使服务端仍然正常但用户已经无法正常使用应用了。而对于透明代理WAF来说如果WAF宕机了只是无法提供Web防护而已客户端和服务端的通信不会受到任何影响。
最后,我们来看**插件模式**。在插件模式中WAF不再是网络中一个独立的安全产品了而是以插件的形式依附于Web服务端本身为Web安全提供防护。
那怎么才能将WAF植入到服务端的逻辑中呢我们最常使用的一种技术就是[AOP](https://baike.baidu.com/item/AOP/1332219?fr=aladdin)Aspect Oriented Programming面向切面编程技术。在AOP技术中WAF可以作为一个切片植入到服务端的逻辑中。
![](https://static001.geekbang.org/resource/image/70/cd/7088839e71a8ea0ad30251924a60f7cd.jpg)
而且目前AOP技术十分流行各类编程语言都支持。所以插件模式的WAF部署同样十分简单。但是这种将WAF和服务端强耦合的方式会带来一定的负向影响。
首先WAF和服务端一块工作在服务器上会消耗服务器额外的资源对Web服务本身的性能产生影响。
其次WAF和服务端耦合也就意味着WAF的所有改动都会直接影响到服务端。对于代理模式的WAF来说通常只需要自测就可以升级了。而对于插件模式的WAF它本身的升级必须和服务端一起进入评估和测试流程就会增加额外的工作量。
为了帮助你理解这三种工作模式,我总结了一张表格。
![](https://static001.geekbang.org/resource/image/0a/99/0a25d69ed7803de96a8e2bb50232b899.jpeg)
总结一下关于WAF的三种工作模式你需要重点掌握这些内容首先WAF将处理的请求协议限定为HTTP所以WAF比应用网关防火墙具备更高的专业性和灵活性其次WAF可以以代理的形式在网络中提供Web安全防护也可以作为插件嵌入到服务端中最后我们也可以根据需求、成本和硬件环境等因素选择不同的部署模式对Web安全进行防护。
## WAF的功能
在了解WAF的主要工作模式之后我们知道在部署模式上WAF比防火墙具备更高的灵活性。WAF可以根据不同的需求以不同的形式为Web服务提供保护。同样地在功能上WAF也可以去实现一些HTTP请求中特有的安全功能。比如去解析HTTP数据、解密HTTPS流量等。下面我们就来看一下WAF到底有哪些功能服务
### 1\. HTTP解析能力
我们知道WAF专注于Web安全。因此对HTTP请求进行解析是WAF最基础的能力。在HTTP中通用的内容包括请求的URL以及其中的参数、HTTP头部信息、POST的body内容等。
除此之外某些攻击特征可能隐藏得比较深比如JSON中的某个字段无法通过JSON的整体内容检测出来我们必须一个字段一个字段去判断。因此WAF还需要解析XML、JSON等RPC传输协议能够理解对应的key和value分别是什么。
除了单纯地解析内容WAF还需要对HTTP内容做必要的处理。为什么要这么做呢这主要有两方面原因。
第一HTTP中的内容可能经过了UrlEncode等编码方式的处理因此**WAF需要具备解码能力避免攻击的特征通过编码来进行绕过**。
第二,**想要看到HTTPS中的加密内容WAF必须能够解密HTTPS请求**。在透明代理模式中WAF需要和服务端同步HTTPS的密钥才能够获得解密的请求在反向代理模式中WAF自带证书可以直接解密在插件模式中WAF依靠服务端解密请求之后再进行HTTP的解析。
### 2\. Web安全防护
通过对HTTP请求进行解析、对编码内容进行解码和对HTTPS进行解密之后WAF就能够获得全部HTTP请求内容了。在此基础之上WAF就可以对请求内容进行分析为Web服务提供安全保护了。
我总结了三种主要的分析手段。
* 签名匹配和杀毒软件中病毒库的概念类似WAF也可以维护一个攻击样本库。样本库中存有已知攻击请求的散列签名只要HTTP请求内容的散列签名在这个样本库就说明HTTP请求中携带了攻击内容。
* 正则匹配签名匹配需要请求完全一致才能够检测出来而正则匹配只需要部分特征就可以检测。WAF可以通过抽象一些攻击特征的正则表达式对HTTP请求进行检测。比如如果请求的某个参数中出现了单引号那么很有可能就是黑客发起的SQL注入攻击。
* 行为分析除了针对单次请求的分析之外WAF还可以针对连续的访问请求特征进行提取和分析。为什么要这么做呢这是因为很多时候我们无法准确判断单次请求是不是攻击请求但是如果疑似的攻击请求频繁出现我们就基本能够确定了。也就是说一个用户不会频繁地访问同一个页面而黑客需要对一个漏洞点发起多次尝试才能够实现攻击的效果。
在识别到攻击的请求之后WAF就可以对请求进行拦截从而避免Web服务受到黑客的攻击了。
### 3\. 审计告警
WAF还有另外一个重要的功能就是为Web服务提供安全相关的审计和告警功能。Web安全相关的审计包括发生攻击的时间、路径、频次等。通过这些信息开发人员能够知道自己的Web服务面对的攻击威胁是什么样的也就能够更好地评估威胁完善Web安全防护机制。
除此之外WAF还能提供其他的审计能力。这是因为WAF能够解析出HTTP请求的全部内容提供审计所需要的全部日志字段。这些日志可以是各个页面的访问次数、用户的访问行为和接口的响应性能等。尽管这些指标和安全没有太多关系但是它们对于产品设计和服务质量来说都很常见那么WAF就可以作为一个统计分析工具来为你提供服务。
### 4\. 数据保护和虚拟补丁
反向代理或者插件模式的WAF还能够对HTTP请求中的数据进行一定的处理提供额外的数据保护功能。
最简单的WAF可以加密HTTP响应中的Cookie内容使得Cookie以保密的形式存储在浏览器中。当浏览器将加密后的Cookie附加到HTTP请求中的时候WAF又可以进行解密。这样一来服务端接收到的始终是明文的信息而实际上WAF通过加解密为Cookie提供了额外的保护。另外WAF还可以对返回内容中的手机号、身份证号等敏感字段进行统一的打码处理避免因为开发的疏忽导致这些敏感信息的泄露。
在介绍插件漏洞的时候我们提到了防火墙可以提供虚拟补丁的功能来临时对插件漏洞进行修复。如果插件是Web相关的服务那么WAF是不是也可以提供虚拟补丁的功能呢当然是可以的。那WAF是如何提供虚拟补丁的呢我来举个简单的例子。
在经典的Structs 2漏洞中黑客是通过Structs 2中包含的漏洞接口发起攻击的。所以WAF只需要将这些包含漏洞的接口进行封禁或者对请求内容中的Structs 2攻击特征特定接口的异常序列化数据进行分析拦截就能够临时避免Structs 2受到已公开的漏洞攻击。之后我们只需要对Structs 2进行升级再打上补丁这样就可以下线虚拟补丁了。
## 总结
好了,今天的内容讲完了。我们来一起总结回顾一下,你需要掌握的重点内容。
在今天的课程中我们主要介绍了WAF的工作模式和主要功能。简单来说WAF就是专注于Web安全的防火墙它能够以透明代理、反向代理和插件的模式运行在网络和系统的各个环节中。从功能上来说WAF能够解决绝大部分的Web安全问题对于黑客针对Web的攻击进行分析和拦截同时提供额外的审计告警、数据保护等能力。
同样地在选取WAF的时候我们首先需要考虑功能的完整性和易用性。公司能够以较低的成本部署WAF并解决大部分的Web安全问题这是WAF最关键的效果。其次就是可配置和可维护性对于漏过的攻击请求如何进行补充完善对于误判的请求如何进行放行这是我们在使用WAF过程中必然会遇到的问题。一个好的WAF产品应该提供友好的入口供开发和运维人员对漏过和误判的规则进行维护。
![](https://static001.geekbang.org/resource/image/37/29/3765e8983fd74023b6ab839a7e5b1b29.jpg)
## 思考题
最后,给你留一道思考题。
任何安全产品都不可能达到100%的安全。你可以思考一下在Web安全中黑客能够通过哪些方式绕过WAF的检测和过滤呢
欢迎留言和我分享你的思考和疑惑,也欢迎你把文章分享给你的朋友。我们下一讲再见!