AWS WAF를 사용할 때 HTTP 요청에 대한 XSS 또는 SQLi 검사에서 특정 URI를 제외하려면 어떻게 해야 합니까?

최종 업데이트 날짜: 2022년 7월 21일

특정 HTTP 요청에서 SQL 명령어 삽입(SQLi) 또는 크로스 사이트 스크립팅(XSS) 오탐 메시지를 수신하려고 합니다.  AWS WAF를 사용할 때 HTTP 요청에 대한 XSS 또는 SQLi 검사에서 특정 URI를 제외하려면 어떻게 해야 합니까?

간략한 설명

AWS Managed Rules 및 사용자 지정 규칙에 대한 XSS 및 SQLi 규칙 검사 중에 거짓양성이 발생하는 경우가 있습니다. XSS 및 SQLi 검사에서 특정 URI 경로를 제외하여 거짓양성을 방지할 수 있습니다. 이렇게 하려면 요청이 다른 모든 규칙에 대해 평가받도록 중첩문을 사용하여 허용 규칙을 작성합니다.

해결 방법

HTTP 또는 HTTPS 요청의 예

http://www.amazon.com/path/string1?abc=123&xyz=567

이전 요청에서 URI 경로는'/path/string1'입니다. '?' 다음에 오는 모든 문자열을 쿼리 문자열이라고 합니다(예: 앞의 예제에서 ' abc=123&xyz=567'). 쿼리 문자열에서 'abc'와 'xyz'는 각각 값이 '123' and '567'인 파라미터입니다.

XSS 또는 SQLi 검사에서 특정 URI를 허용하기 위한 예제 규칙

참고: 다음 예제 규칙 구성은 참조용으로만 사용하십시오. 이러한 규칙은 PositionalConstraint, SearchString, TextTransformations 등에 대하여 사용자 정의해야 합니다. 유사한 논리를 사용하여 특정 헤더, 쿼리 파라미터 등을 허용할 수 있습니다.

사례 1: AWS 관리형 규칙 사용

AWS 관리형 규칙 그룹 AWSManagedRulesCommonRuleSet는 다음 규칙을 포함합니다.

  • CrossSiteScripting_COOKIE
  • CrossSiteScripting_QUERYARGUMENTS
  • CrossSiteScripting_BODY
  • CrossSiteScripting_URIPATH

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

마찬가지로 규칙 그룹 AWSManagedRulesSQLiRuleSet에는 쿼리 파라미터, 본문 및 쿠키에서 SQLi 명령어 삽입 공격 패턴을 검사하는 규칙이 있습니다. 자세한 내용은 사용 사례별 규칙 그룹을 참조하십시오.

요청이 위의 규칙과 일치하면, AWS WAF가 해당 레이블을 생성합니다. 레이블은 나중에 웹 ACL에 정의된 규칙에서 특정 요청을 선택적으로 제외하는 데 사용합니다(이 예에서는 URI를 기반으로 함).

특정 URI를 허용하려면 다음을 수행합니다.

1.    AWSManagedRulesCommonRuleSet 그룹의 다음 규칙을 Count 모드로 유지합니다.

  • CrossSiteScripting_COOKIE
  • CrossSiteScripting_QUERYARGUMENTS
  • CrossSiteScripting_BODY
  • CrossSiteScripting_URIPATH

2.    AWSManagedRulesCommonRuleSet보다 낮은 우선 순위로 구성된 허용 규칙을 생성합니다.

규칙의 논리는 다음과 같습니다.

(XSS_URIPATH or XSS_Cookie or XSS_Body or XSS_QueryArguments) AND (NOT whitelisted 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": "URI_SearchString",
                "FieldToMatch": {
                  "UriPath": {}
                },
                "TextTransformations": [
                  {
                    "Priority": 0,
                    "Type": "NONE"
                  }
                ],
                "PositionalConstraint": "CONTAINS"
              }
            }
          }
        }
      ]
    }
  },
  "Action": {
    "Block": {}
  },
  "VisibilityConfig": {
    "SampledRequestsEnabled": true,
    "CloudWatchMetricsEnabled": true,
    "MetricName": "whitelist-xss"
  }
}

AWSManagedRulesSQLiRuleSet에 대한 앞의 단계를 수행합니다. 이를 위해 레이블을 AWSManagedRulesSQLiRuleSet 생성 레이블로 변경합니다.

사례 2: 사용자 지정 XSS 및 SQLi 규칙 사용

규칙의 논리는 다음과 같습니다.

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

특정 URI_PATH를 선택적으로 제외하면서 요청에 대한 XSS 공격 문자열을 검사하려면, 규칙에 대해 다음 구성을 사용합니다.

{
  "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": "URI_SearchString",
                "TextTransformations": [
                  {
                    "Type": "NONE",
                    "Priority": 0
                  }
                ]
              }
            }
          }
        }
      ]
    }
  }
}

SQLi 문을 사용할 때는 앞의 절차를 따릅니다.

참고: URI만 허용하는 우선순위가 높은 규칙은 사용하지 않는 것이 좋습니다. 이렇게 하면 허용한 URI_PATH가 있는 요청을 웹 ACL에 정의된 다른 모든 규칙에 대해 평가할 수 없습니다.


이 문서가 도움이 되었나요?


결제 또는 기술 지원이 필요하세요?