Azure’s Front Door WAF WTF: IP Restriction Bypass
背景
Azure提供两种WAF:Front Door WAF(全局WAF)和Application Gateway WAF(区域WAF)。本文讨论的IP限制绕过仅适用于Front Door WAF。
在Front Door WAF中,如果选择按IP地址限制访问,默认变量是RemoteAddr。从下拉菜单中可以看到两个选项:RemoteAddr或SocketAddr。
根据Microsoft文档,RemoteAddr变量匹配原始客户端的IP地址,并尊重X-Forwarded-For HTTP标头(如果设置)。而SocketAddr变量是WAF看到的真实IP地址。
问题核心
默认选择的RemoteAddr变量可以通过添加X-Forwarded-For标头轻松绕过,且Microsoft确认这是预期行为。
更糟糕的是,Application Gateway WAF中的RemoteAddr变量指的是WAF看到的IP地址(相当于Front Door WAF中的SocketAddr变量)。Microsoft在相关产品中使用相同的变量名表示完全不同的含义!
服务 | 变量名 | 描述 |
---|---|---|
Front Door | RemoteAddr | 由X-Forwarded-For设置的IP地址或WAF看到的IP地址 |
Front Door | SocketAddr | WAF看到的IP地址 |
Application Gateway | RemoteAddr | WAF看到的IP地址 |
测试设置
- 设置一个简单的测试站点
- 配置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脚本(可在Azure Cloud Shell中运行)来检测是否使用了不安全的RemoteAddr变量。
此检查也已集成到GraphRunner工具中,需要获取管理端点令牌后运行Check-FrontDoorWAF命令。
修复
简单的修复方法是更新Front Door WAF配置以使用SocketAddr变量。
如果需要使用RemoteAddr功能并能够区分代理后面的用户,可以添加第二个"如果"条件,要求SocketAddr匹配代理服务器的IP地址。
结论
Front Door WAF中的RemoteAddr选项不应被列为IP限制,因为它实际上只是匹配标头值。Microsoft应该在创建规则的界面上更清楚地记录这个安全漏洞。
变量名应在产品之间保持一致。在一个版本中安全可靠的功能不应在另一个版本中完全相反。
如果你使用Azure Front Door WAF,请确保使用SocketAddr变量进行匹配!
参考
配置带有WAF的IP限制规则 for Azure Front Door https://learn.microsoft.com/en-us/azure/web-application-firewall/afds/waf-front-door-configure-ip-restriction