如何在 AWS WAF 中從 HTTP 請求的 XSS 或 SQLi 檢查中排除特定 URI?

3 分的閱讀內容
0

當我使用 AWS WAF 時,某些 HTTP 請求出現 SQL 隱碼攻擊 (SQLi) 或跨網站指令碼 (XSS) 的誤報。我想從 HTTP 請求的 XSS 或 SQLi 檢查中排除特定 URI。

簡短描述

在對 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 路徑和 SQL 隱碼攻擊模式的 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 請求的一部分及其相符標籤建立個別規則是安全性最佳實務。對於此個別規則,請勿從 Web 請求的所有部分中排除特定的 URI 路徑。

對於 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 官方已更新 9 個月前