如何在 AWS WAF 中将特定的 URI 从对 HTTP 请求的 XSS 或 SQLi 检查中排除?

3 分钟阅读
0

我在使用 AWS WAF 时,某些 HTTP 请求的 SQL 注入(SQLi)或跨站脚本(XSS)会出现误报。我想将特定的 URI 从对 HTTP 请求的 XSS 或 SQLi 检查中排除。

简短描述

在对 AWS 托管规则和自定义规则进行 XSS 和 SQLi 规则检查期间,有时会出现误报。为避免误报,应从 XSS 和 SQLi 检查中排除特定的 URI 路径。为此,可以使用嵌套语句编写包含例外的阻止规则,让 AWS WAF 根据所有其他规则评估请求。

解决方法

HTTP 或 HTTPS 请求示例

http://www.amazon.com/path/string1?xss=%3Cscript%3E%3Cscript%3E&sql=UNION%20ALL%20SELECT%201

在此请求中,URI 路径为 /path/string1。问号(?)后面的字符串为查询字符串。在此示例中,查询字符串为 xss=%3Cscript%3E%3Cscript%3E&sql=UNION%20ALL%20SELECT%201

在 XSS 或 SQLi 检查中允许特定 URI 的示例规则

注意: 以下示例规则配置仅供参考。对于 PositionalConstraintSearchStringTextTransformations 等,应该自定义规则。您可以使用相似逻辑允许特定标头、查询参数等。

案例 1: 使用 AWS 托管规则

AWS 托管规则组 AWSManagedRulesCommonRuleSet 包含以下规则:

  • CrossSiteScripting_COOKIE
  • CrossSiteScripting_QUERYARGUMENTS
  • CrossSiteScripting_BODY
  • CrossSiteScripting_URIPATH

AWSManagedRulesCommonRuleSet 规则组有一个 BLOCK 操作,用于检查请求的对应部分是否有 XSS 攻击字符串。有关更多信息,请参阅核心规则集(CRS)托管规则组

同样,规则组 AWSManagedRulesSQLiRuleSet 也有检查查询参数、正文、URI 路径和 SQLi 注入攻击模式的 Cookie 的规则。有关更多信息,请参阅用例特定规则组

当请求符合这些规则时,AWS WAF 会生成相应的标签。然后,WEB ACL 中的自定义规则可以使用这些 AWS 托管规则标签有选择地从匹配的规则签名中排除特定请求。

要允许特定 URI,请完成以下步骤:

1.在计数模式下保留 AWSManagedRulesCommonRuleSet 规则组中的以下规则:

  • CrossSiteScripting_COOKIE
  • CrossSiteScripting_QUERYARGUMENTS
  • CrossSiteScripting_BODY
  • CrossSiteScripting_URIPATH

2.创建带有阻止操作和 URI 路径例外的规则。将规则的优先级配置为低于 AWSManagedRulesCommonRuleSet。要在 AWS WAF 控制台中配置更低的优先级,将规则放在列表中更靠下的位置。要在 JSON 中配置更低的优先级,使用更大的优先级值。

规则使用以下逻辑:

(XSS_URIPATH or XSS_Cookie or XSS_Body or XSS_QueryArguments) AND (NOT allowlisted URIString) = BLOCK

使用以下配置:

{
  "Name": "whitelist-xss",
  "Priority": 10,
  "Statement": {
    "AndStatement": {
      "Statements": \[
        {
          "OrStatement": {
            "Statements": \[
              {
                "LabelMatchStatement": {
                  "Scope": "LABEL",
                  "Key": "awswaf:managed:aws:core-rule-set:CrossSiteScripting\_URIPath"
                }
              },
              {
                "LabelMatchStatement": {
                  "Scope": "LABEL",
                  "Key": "awswaf:managed:aws:core-rule-set:CrossSiteScripting\_Cookie"
                }
              },
              {
                "LabelMatchStatement": {
                  "Scope": "LABEL",
                  "Key": "awswaf:managed:aws:core-rule-set:CrossSiteScripting\_Body"
                }
              },
              {
                "LabelMatchStatement": {
                  "Scope": "LABEL",
                  "Key": "awswaf:managed:aws:core-rule-set:CrossSiteScripting\_QueryArguments"
                }
              }
            \]
          }
        },
        {
          "NotStatement": {
            "Statement": {
              "ByteMatchStatement": {
                "SearchString": "/path/string1",
                "FieldToMatch": {
                  "UriPath": {}
                },
                "TextTransformations": \[
                  {
                    "Priority": 0,
                    "Type": "NONE"
                  }
                \],
                "PositionalConstraint": "CONTAINS"
              }
            }
          }
        }
      \]
    }
  },
  "Action": {
    "Block": {}
  },
  "VisibilityConfig": {
    "SampledRequestsEnabled": true,
    "CloudWatchMetricsEnabled": true,
    "MetricName": "whitelist-xss"
  }
}

注意: 在此示例中,OrStatement 从 Web 请求的所有标签和部分中排除特定 URI:正文、标头、URI 路径和查询参数。此示例假设您在 Web 请求的所有部分中都遇到同一个 URI 的误报。但是,您可能只是在 Web 请求的一个部分中遇到,如在查询参数中。在这种情况下,确保安全的最佳做法是仅为 Web 请求的一个部分及其匹配的标签创建单独的规则。在这个规则中,不将特定 URI 路径从 Web 请求的所有部分中排除。

对于 AWSManagedRulesSQLiRuleSet,使用相同的步骤,但将标签替换为 AWSManagedRulesSQLiRuleSet 生成的标签。

如果您要在检查中排除多个 URI,则在 NotStatement 中使用 OrStatement。例如,要排除 /path/string1/path/string2,使用以下 NotStatement

{
  "NotStatement": {
    "Statement": {
      "OrStatement": {
        "Statements": \[
          {
            "ByteMatchStatement": {
              "SearchString": "/path/string1",
              "FieldToMatch": {
                "UriPath": {}
              },
              "TextTransformations": \[
                {
                  "Priority": 0,
                  "Type": "NONE"
                }
              \],
              "PositionalConstraint": "CONTAINS"
            }
          },
          {
            "ByteMatchStatement": {
              "SearchString": "/path/string2",
              "FieldToMatch": {
                "UriPath": {}
              },
              "TextTransformations": \[
                {
                  "Priority": 0,
                  "Type": "NONE"
                }
              \],
              "PositionalConstraint": "CONTAINS"
            }
          }
        \]
      }
    }
  }
}

案例 2: 使用自定义 XSS 和 SQLi 规则

规则使用以下逻辑:

(XSS_URIPATH or XSS_Cookie or XSS_Body or XSS_QueryArguments) AND (NOT allowlisted URIString) = BLOCK

使用以下规则配置检查请求中是否有 XSS 攻击字符串,也可以选择性地排除特定 URI_PATH

{
  "Name": "xss-URI",
  "Priority": 10,
  "Action": {
    "Block": {}
  },
  "VisibilityConfig": {
    "SampledRequestsEnabled": true,
    "CloudWatchMetricsEnabled": true,
    "MetricName": "xss-URI"
  },
  "Statement": {
    "AndStatement": {
      "Statements": \[
        {
          "OrStatement": {
            "Statements": \[
              {
                "XssMatchStatement": {
                  "FieldToMatch": {
                    "UriPath": {}
                  },
                  "TextTransformations": \[
                    {
                      "Priority": 0,
                      "Type": "NONE"
                    }
                  \]
                }
              },
              {
                "XssMatchStatement": {
                  "FieldToMatch": {
                    "Cookies": {
                      "MatchPattern": {
                        "All": {}
                      },
                      "MatchScope": "ALL",
                      "OversizeHandling": "CONTINUE"
                    }
                  },
                  "TextTransformations": \[
                    {
                      "Priority": 0,
                      "Type": "NONE"
                    }
                  \]
                }
              },
              {
                "XssMatchStatement": {
                  "FieldToMatch": {
                    "Body": {
                      "OversizeHandling": "CONTINUE"
                    }
                  },
                  "TextTransformations": \[
                    {
                      "Priority": 0,
                      "Type": "NONE"
                    }
                  \]
                }
              },
              {
                "XssMatchStatement": {
                  "FieldToMatch": {
                    "AllQueryArguments": {}
                  },
                  "TextTransformations": \[
                    {
                      "Priority": 0,
                      "Type": "NONE"
                    }
                  \]
                }
              }
            \]
          }
        },
        {
          "NotStatement": {
            "Statement": {
              "ByteMatchStatement": {
                "FieldToMatch": {
                  "UriPath": {}
                },
                "PositionalConstraint": "CONTAINS",
                "SearchString": "/path/string1",
                "TextTransformations": \[
                  {
                    "Type": "NONE",
                    "Priority": 0
                  }
                \]
              }
            }
          }
        }
      \]
    }
  }
}

使用 SQLi 语句时,按照以下过程操作。

注意: 设置一个优先级更高、只允许 URI 的规则并不是最佳做法。这会阻止根据 Web ACL 中定义的所有其他规则对具有允许的 URI_PATH 的请求进行评估。

相关信息

规则语句基础知识

跨站脚本攻击规则语句

SQL 注入攻击规则语句

AWS 官方
AWS 官方已更新 8 个月前
没有评论