强曰为道
与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

CDN 与 WAF 精讲教程 / 第06章 WAF 基础原理

第06章 WAF 基础原理

本章介绍 WAF 的核心工作原理、常见部署模式、规则引擎设计以及对 OWASP Top 10 的防护能力。


6.1 WAF 工作原理

6.1.1 WAF 核心架构

客户端请求
    │
    ▼
┌──────────────────────────────────────────────────────────────┐
│                     WAF 处理流水线                             │
│                                                              │
│  ┌──────────┐  ┌──────────┐  ┌──────────┐  ┌──────────────┐ │
│  │ 请求解析  │→│ 规则匹配  │→│ 决策引擎  │→│  响应处理     │ │
│  │          │  │          │  │          │  │              │ │
│  │ - URL    │  │ - 正则   │  │ - 允许   │  │ - 放行       │ │
│  │ - Header │  │ - 语义   │  │ - 拦截   │  │ - 拦截       │ │
│  │ - Body   │  │ - 行为   │  │ - 限速   │  │ - 重定向     │ │
│  │ - Cookie │  │ - ML     │  │ - 日志   │  │ - 日志       │ │
│  └──────────┘  └──────────┘  └──────────┘  └──────────────┘ │
│                                                              │
│  时间预算: < 5ms (不影响正常请求延迟)                         │
└──────────────────────────────────────────────────────────────┘
    │
    ▼
源站 / 拦截响应

6.1.2 检测方法对比

方法 原理 优点 缺点
正则匹配 正则表达式匹配恶意特征 精确、可控 规则维护成本高
语义分析 解析 SQL/HTML/JS 语义 准确率高 CPU 消耗大
行为分析 分析请求频率、模式 检测未知攻击 误报率较高
机器学习 训练模型识别异常 自适应 需要大量训练数据
签名匹配 已知攻击指纹库 快速匹配 无法检测 0day

6.2 WAF 部署模式

6.2.1 三种部署模式

模式1: 反向代理模式 (Reverse Proxy)

  用户 ──→ [WAF] ──→ 源站
           ▲
           │ 终结 TLS,检查请求,转发到源站
           │ 可修改请求/响应

模式2: 透明桥接模式 (Transparent Bridge)

  用户 ──→ [WAF] ──→ 源站
           ▲
           │ 二层桥接,不改变网络拓扑
           │ 仅检查,不修改流量

模式3: 旁路模式 (Out-of-Band / TAP)

  用户 ──→ ──────────→ 源站
           │
           └──→ [WAF] (镜像流量,仅监控告警)
                 ▲
                 │ 通过 SPAN/TAP 镜像流量
                 │ 不影响正常流量

6.2.2 部署模式对比

特性 反向代理 透明桥接 旁路
拦截能力 ✅ 完全 ✅ 完全 ❌ 仅监控
网络改动
性能影响 较大(TLS 终结) 较小
部署复杂度
适用场景 公网 Web 服务 内网防护 检测/审计
高可用 需要 LB 需要 STP/RSTP 天然不影响

6.2.3 CDN 集成 WAF 模式

现代架构: CDN 内置 WAF

  用户 ──→ [CDN 边缘节点]
               │
               ├── WAF 检查
               ├── 缓存查找
               ├── 压缩
               │
               └──→ 源站

  优势:
  - WAF 在边缘拦截,恶意流量不到达源站
  - TLS 卸载在边缘完成
  - 无需额外部署 WAF 硬件/软件
  - 自动扩缩容

6.3 规则引擎

6.3.1 规则引擎架构

┌─────────────────────────────────────────────────────────────────┐
│                      WAF 规则引擎                                │
│                                                                 │
│  ┌────────────────────────────────────────────────────────────┐ │
│  │  Phase 1: 预处理                                           │ │
│  │  ├── URL 解码 / Unicode 规范化                              │ │
│  │  ├── HTML 实体解码                                          │ │
│  │  ├── Base64 解码                                            │ │
│  │  └── 空白字符规范化                                         │ │
│  └────────────────────────────────────────────────────────────┘ │
│                           │                                     │
│  ┌────────────────────────▼───────────────────────────────────┐ │
│  │  Phase 2: 规则匹配                                         │ │
│  │  ├── 规则集遍历(按优先级排序)                              │ │
│  │  ├── 正则表达式匹配                                         │ │
│  │  ├── 字符串匹配(Aho-Corasick 等)                         │ │
│  │  └── 复合条件评估                                           │ │
│  └────────────────────────────────────────────────────────────┘ │
│                           │                                     │
│  ┌────────────────────────▼───────────────────────────────────┐ │
│  │  Phase 3: 评分与决策                                       │ │
│  │  ├── 累计异常评分 (Anomaly Score)                           │ │
│  │  ├── 阈值判断(默认: 5 分拦截)                             │ │
│  │  ├── 白名单检查                                             │ │
│  │  └── 生成最终动作: PASS / BLOCK / LOG / CHALLENGE          │ │
│  └────────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘

6.3.2 ModSecurity 规则示例

# ModSecurity CRS (Core Rule Set) 规则示例

# SQL 注入检测
SecRule ARGS "@detectSQLi" \
    "id:942100,\
    phase:2,\
    block,\
    msg:'SQL Injection Attack Detected',\
    severity:'CRITICAL',\
    tag:'attack-sqli',\
    tag:'OWASP_CRS'"

# XSS 检测
SecRule ARGS "@detectXSS" \
    "id:941100,\
    phase:2,\
    block,\
    msg:'XSS Attack Detected',\
    severity:'CRITICAL',\
    tag:'attack-xss',\
    tag:'OWASP_CRS'"

# 路径遍历
SecRule REQUEST_URI "@rx \.\./\.\." \
    "id:930100,\
    phase:1,\
    block,\
    msg:'Path Traversal Attack',\
    severity:'CRITICAL',\
    tag:'attack-lfi'"

6.3.3 规则动作

动作 说明 使用场景
PASS 放行请求 白名单命中
BLOCK 拦截请求,返回错误页 攻击确认
DROP 直接断开连接 严重攻击
REDIRECT 重定向到指定 URL 引导到验证页
LOG 仅记录日志不拦截 监控模式
CHAIN 链式匹配(AND 逻辑) 复合条件
ALLOW 全局放行,跳过后续规则 白名单

6.4 OWASP Top 10 防护详解

6.4.1 A01: Broken Access Control(失效的访问控制)

攻击类型:
├── IDOR(不安全的直接对象引用)
│   GET /api/user/123 → GET /api/user/456
│
├── 路径遍历
│   GET /files/../../../etc/passwd
│
├── CORS 配置错误
│   Origin: evil.com → Access-Control-Allow-Origin: evil.com
│
└── 越权操作
    PUT /api/admin/users (普通用户调用)

WAF 防护规则:
├── 拦截路径遍历模式 (../)
├── 验证 CORS Origin 白名单
├── 限制敏感路径访问(/admin/*)
└── 检查 HTTP 方法与路径匹配

6.4.2 A03: Injection(注入攻击)

SQL 注入示例:
  GET /search?q=' OR '1'='1' --
  GET /user?id=1 UNION SELECT * FROM users

  WAF 检测模式:
  ├── 关键字匹配: UNION SELECT, OR '1'='1, --
  ├── 语义分析: SQL 语法树解析
  └── 参数异常: 数字参数中出现引号

命令注入示例:
  POST /ping  host=127.0.0.1; cat /etc/passwd

  WAF 检测模式:
  ├── 命令分隔符: ; | && || ` $(  )
  └── 危险命令: cat, ls, whoami, curl, wget

XSS 注入示例:
  GET /search?q=<script>alert(1)</script>

  WAF 检测模式:
  ├── HTML 标签: <script>, <img onerror>
  └── JS 事件: onclick, onerror, onload

6.4.3 OWASP 防护能力矩阵

OWASP 风险 WAF 防护能力 防护深度
A01 访问控制 路径限制、CORS 校验
A02 加密失败 强制 HTTPS、密码套件限制
A03 注入攻击 核心防护能力
A04 不安全设计 速率限制
A05 安全配置 安全头注入、信息泄露防护
A06 组件漏洞 虚拟补丁
A07 认证失败 暴力破解防护
A08 数据完整性 请求签名校验
A09 日志不足 完整审计日志
A10 SSRF 出站请求过滤

6.5 WAF 与 CDN 集成

6.5.1 主流 CDN WAF 对比

功能 Cloudflare AWS WAF 阿里云 WAF 自建 ModSecurity
部署方式 CDN 内置 ALB/CF 边缘 独立服务 自建反向代理
规则集 内置 + 自定义 托管规则 内置 + 自定义 CRS + 自定义
机器学习
Bot 管理 AWS Bot 有限
DDoS 防护 免费基础 Shield 需额外方案
价格 免费-$20/月 按规则+请求计费 按套餐 人力成本

6.5.2 Cloudflare WAF 规则示例

# Cloudflare WAF 自定义规则

# 阻止来自特定国家的请求访问管理后台
(http.request.uri.path contains "/admin") and
(ip.geoip.country in {"CN" "RU" "KP"}) and
(not ip.src in {企业办公网IP})
→ Action: Block

# 阻止恶意 User-Agent
(http.user_agent contains "sqlmap") or
(http.user_agent contains "nikto") or
(http.user_agent contains "nmap")
→ Action: Block

# 限速:API 接口每分钟最多 60 次
(http.request.uri.path matches "^/api/") and
(rate gt 60)
→ Action: Challenge (Managed Challenge)

6.6 注意事项

⚠️ 误报管理:WAF 规则过于严格会导致正常请求被拦截(误报)。上线前务必在"监控模式"下运行至少 1 周,观察日志后再启用拦截。

⚠️ 规则更新:攻击手法不断演进,WAF 规则集需定期更新。OWASP CRS 每季度发布新版本。

⚠️ 绕过风险:WAF 不是万能的。编码绕过、分块传输、HTTP 参数污染等技术可绕过部分 WAF。需定期进行渗透测试。

⚠️ 性能开销:WAF 规则数量直接影响处理延迟。建议规则数量控制在 500 条以内。


6.7 扩展阅读


本章小结

主题 核心要点
工作原理 请求解析 → 规则匹配 → 决策 → 响应处理
部署模式 反向代理(最安全)、透明桥接、旁路(仅监控)
规则引擎 预处理 → 规则匹配 → 评分 → 决策
OWASP WAF 对注入类攻击防护最强,逻辑漏洞需应用层配合
集成 CDN 内置 WAF 是当前主流方案

下一章:第07章 WAF 规则详解 →