Analyze and Fix Azure WAF False Positive Blocks

关于WAF 拦截排查的官方指导doc请见: Troubleshoot - Azure Web Application Firewall | Microsoft Learn

查找LogA日志

LogA sample 可参考: Examining logs using Azure Log Analytics - Azure Application Gateway | Microsoft Learn

  • 可以先根据URI以及**action_s == “blocked”**过滤出被block的请求;
  • 针对某一请求,过滤transaction ID,即可找到这个请求匹配了哪些WAF 规则,rule 949110 代表改请求被block。

判断分析

  • 如果请求被customer rule拦截,需要进一步检查custom rule是否符合预期;
  • 如果请求被托管规则拦截,可以从拦截日志中找到匹配的正则表达式,或者从coreruleset官方找到对应的正则表达式(注意对应的规则版本);
  • 通过在线工具,比如regex101: build, test, and debug regex,可以进一步判断匹配情况。

举例如下匹配情况:

注:==ARGS==表示是key:vlue pair里的value的内容匹配上了;如果看到==ARGS_NAMES==,则表示是key:vlue pair里的key的名称匹配上了。==REQUEST_COOKIES==则代表cokkie的内容匹配上了。

关于WAF匿名积分模式

What is Azure Web Application Firewall on Azure Application Gateway? - Azure Web Application Firewall | Microsoft Learn

There’s a threshold of 5 for the Anomaly Score to block traffic.

Severity Value
Critical 5
Error 4
Warning 3
Notice 2
check setvar:’tx.inbound_anomaly_score_pl2=+%{tx.==critical==_anomaly_score}’”

常见拦截解决方案

请先确认被block的内容在业务上是否是预期的,或是否可以避免,如果确实需要bypass拦截。针对不同的匹配场景,一般有以下bypass的方式,可以根据实际业务情况选用具体方案:

  1. Exclusion: 针对特定的Header/cookie/args的名称或内容,允许WAF不进行特定OWASP rule的检查;【Recommended】
Matching variable的三种类型:Web application firewall exclusion lists in Azure Application Gateway - Azure portal | Microsoft Learn

文档中的举例: My-Header: 1=1
1. Name (与Value意义等同,推荐使用Value)
如果是想要不检查值的内容“1=1”,请使用 RequestHeaderValues 匹配变量、运算符 contains 和选择器 (My-Header)。
2. Key
如果是想要不检查键的内容“My-Header”,可以使用 RequestHeaderKeys 请求属性为标头键配置排除项。
3. Value (与Name意义等同,推荐使用Value)

  1. custom rule: 将满足条件(如匹配uri)的请求放行;
  2. disable specific OWASP rule (by listener / path-based rule WAF policy): disable rule具有全局效果,但也可以通过配置by listener / path-based rule 的WAF policy实现更精细粒度的控制。