Azure Front Door WAF WTF: IP 限制绕过
背景
Azure 提供两种 WAF:Front Door WAF(全局 WAF)和 Application Gateway WAF(区域 WAF)。本文讨论的 IP 限制绕过仅适用于 Front Door WAF。
在 Front Door WAF 中,如果选择按 IP 地址限制访问,默认选项是名为 RemoteAddr 的变量。另一个选项是 SocketAddr。
RemoteAddr 与 SocketAddr 的区别
根据 Microsoft 文档:
RemoteAddr变量匹配原始客户端的 IP 地址,并尊重设置的X-Forwarded-ForHTTP 头。SocketAddr变量是 WAF 看到的真实 IP 地址。
这意味着,默认的 RemoteAddr 选项可以通过添加带有适当 IP 地址的 X-Forwarded-For 头来绕过。
测试设置
- 设置一个简单的测试站点。
- 配置 Azure Front Door,路由到测试站点。
- 配置安全策略和 WAF 策略。
- 创建自定义规则,允许特定 IP 地址(例如 123.45.67.89)并匹配
RemoteAddr变量。 - 将 WAF 设置为预防模式。
验证阻塞规则
正常流量(非来自 123.45.67.89)被阻塞,返回 403 响应。
识别 Front Door WAF
Front Door WAF 的响应头中包含 x-azure-ref 和 x-cache。Application Gateway WAF 没有明确标识。
绕过 IP 限制
只需添加 X-Forwarded-For: [IP 地址] 即可绕过限制。此方法仅对 RemoteAddr 变量有效,对 SocketAddr 无效。
额外发现
当自定义规则匹配时,其他 WAF 规则(如 OWASP 攻击检测)会被跳过,攻击者可以无障碍扫描目标。
检测
提供 PowerShell 脚本(可从 GitHub 获取)检测 Front Door WAF 规则是否使用不安全的 RemoteAddr 变量。脚本也可通过 GraphRunner 模块运行。
修复
将 Front Door WAF 配置改为使用 SocketAddr 变量。如果需要区分代理后的用户,可添加第二个条件,要求 SocketAddr 匹配代理服务器 IP。
结论
RemoteAddr 选项不应被列为 IP 限制,因为它实际上只是匹配头值。变量名称应在产品间保持一致(Front Door 和 Application Gateway 的 RemoteAddr 含义不同)。Microsoft 应更清楚地文档化此安全漏洞。
建议 Azure Front Door WAF 用户确保使用 SocketAddr 变量进行匹配。