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匿名积分模式
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的方式,可以根据实际业务情况选用具体方案:
- 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) |
|---|
- custom rule: 将满足条件(如匹配uri)的请求放行;
- disable specific OWASP rule (by listener / path-based rule WAF policy): disable rule具有全局效果,但也可以通过配置by listener / path-based rule 的WAF policy实现更精细粒度的控制。