내용으로 건너뛰기

AWS WAF에서 HTTP 요청에 대한 XSS 또는 SQLi 검사에서 특정 URI를 어떻게 제외합니까?

5분 분량
0

AWS WAF를 사용할 때 일부 HTTP 요청에서 SQL 인젝션(SQLi) 또는 크로스 사이트 스크립팅(XSS) 오탐이 발생합니다. HTTP 요청에 대한 XSS 또는 SQLi 검사에서 특정 URI를 제외하고 싶습니다.

간략한 설명

때때로 AWS Managed Rules 및 사용자 지정 규칙에 대한 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를 허용하는 규칙 예시

XSS 또는 SQLi 검사에서 특정 URI를 허용하려면 AWS Managed 규칙 또는 사용자 지정 XSS 및 SQLi 규칙을 사용할 수 있습니다.

참고: 다음 규칙 구성 예시는 참조용일 뿐입니다. 사용 사례의 PositionalConstraint, SearchString 및 TextTransformations와 같은 정보에 맞춰 이러한 규칙을 사용자 지정하십시오. 유사한 로직을 사용해 특정 헤더 및 쿼리 파라미터와 같은 구성을 허용할 수 있습니다.

AWS Managed Rules 사용

AWS 관리형 규칙 그룹 AWSManagedRulesCommonRuleSet에 다음 규칙이 포함됩니다.

  • CrossSiteScripting_COOKIE
  • CrossSiteScripting_QUERYARGUMENTS
  • CrossSiteScripting_BODY
  • CrossSiteScripting_URIPATH

AWSManagedRulesCommonRuleSet 규칙 그룹에는 요청의 상응하는 부분에서 XSS 공격 문자열을 검사하는 BLOCK 작업이 있습니다. 자세한 내용은 핵심 규칙 세트(CRS) 관리형 규칙 그룹을 참조하십시오.

마찬가지로, 규칙 그룹 AWSManagedRulesSQLiRuleSet에는 SQLi 인젝션 공격 패턴에 대해 쿼리 파라미터, 본문, URI 경로 및 쿠키를 검사하는 규칙이 있습니다. 자세한 내용은 사용 사례별 규칙 그룹을 참조하십시오.

요청이 이러한 규칙과 일치하면 AWS WAF는 상응하는 레이블을 생성합니다. 그런 다음, 웹 ACL의 사용자 지정 규칙이 이러한 AWS 관리형 규칙 레이블을 사용해 일치하는 규칙 서명에서 특정 요청을 선택적으로 제외할 수 있습니다.

특정 URI를 허용하려면 다음 단계를 완료하십시오.

  1. AWSManagedRulesCommonRuleSet 규칙 그룹에서 다음 규칙을 Count 모드로 설정합니다.
    CrossSiteScripting_COOKIE
    CrossSiteScripting_QUERYARGUMENTS
    CrossSiteScripting_BODY
    CrossSiteScripting_URIPATH
  2. URI 경로에 대한 예외를 포함해 BLOCK 작업을 사용하여 규칙을 만듭니다. AWSManagedRulesCommonRuleSet의 우선순위보다 우선순위가 낮도록 규칙을 구성합니다. AWS WAF 콘솔에서 더 낮은 우선순위를 구성하려면 해당 규칙을 목록에서 더 낮은 곳에 배치합니다. JSON에서 더 낮은 우선순위를 구성하려면 더 큰 Priority 값을 사용합니다.
    규칙은 다음 로직을 사용합니다. (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가 웹 요청의 모든 레이블 및 부분(본문, 헤더, URI 경로 및 쿼리 인수)에서 특정 URI를 제외합니다. 이 예시에서는 웹 요청의 모든 부분에서 동일한 URI에 대하여 오탐이 발생했다고 가정합니다. 하지만 웹 요청의 한 부분, 예를 들어 쿼리 인수에서만 오탐이 발생할 수 있습니다. 이 경우, 웹 요청의 한 부분과 그와 일치하는 레이블에 대해서만 별도의 규칙을 만드는 것이 좋습니다. 이 별도의 규칙에 대해서는 웹 요청의 모든 부분에서 특정 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"
            }
          }
        ]
      }
    }
  }
}

사용자 지정 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에 기반해서만 트래픽을 허용하는 우선순위가 높은 규칙을 만들지 마십시오. 이 규칙은 해당 URI 경로와 일치하는 요청에 대해 웹 ACL의 다른 모든 규칙 평가를 우회하므로 모범 사례가 아닙니다.

관련 정보

Using rule statements in AWS WAF(AWS WAF에서 규칙 문 사용)

크로스 사이트 스크립팅 공격 규칙 문

SQL 인젝션 공격 규칙 문

AWS WAF를 사용하여 특정 URI 경로에 대한 액세스를 허용하거나 차단하려면 어떻게 해야 합니까?

AWS 공식업데이트됨 7달 전