Custom Rule Nâng cao

Tình huống

Băng nhóm Sữa Lắc lại tiếp tục tấn công ứng dụng của bạn. Chúng đã thay đổi cách tấn công một lần nữa! Bạn cần phải cập nhật rule để chặn các request xấu xa này trong khi vẫn cho phép khách hàng thực sự gửi request.

Tạo Custom Rule Nâng cao

Tất cả WAF Rule được định nghĩa là một JSON Object. Đối với các rule phức tạp, bạn sẽ dễ dàng xử lý hơn nếu làm việc trực tiếp ở định dạng JSON thay vì sử dụng Rule Editor trên console. Bạn có thể lấy các thông tin của rule hiện tại được định nghĩa bằng JSON thông qua sử dụng bằng API, CLI hoặc Console sử dụng lệnh get-rule-group. Chỉnh sửa chúng sử dụng trình biên soạn JSON mà bạn muốn và tải chúng lên với lệnh update-rule-group sử dụng API, CLI hoặc Console.
Định nghĩa rule sử dụng JSON cho phép bạn áp dụng việc quản lý phiên bản nhằm dễ dàng xem xét cách thức, thời điểm và lý do một tập các rule phức tạp được thay đổi.

  1. Ở trang thông tin Web ACL của bạn.
  • Chọn Web ACL của bạn.
  • Click Manage rules.
  • Click Add rule.

Create the sample web app

Create the sample web app

  • Chọn Custome rule, click Next.
  • Kéo xuống, tiếp tục chọn Custome rule và click Next.

Create the sample web app

Create the sample web app

  1. Rule này sẽ chặn tất cả các request thỏa một trong hai điều kiện:
  • Chứa header x-milkshake: chocolate và header x-favourite-topping: nuts
  • Chứa query parameter milkshake=banana và query parameter favourite-topping=sauce
  1. Ở trang thông tin Web ACL của bạn.
  • Chọn comnplex-rule-challenge vừa tạo.
  • Tại mục JSON điền
{
  "Name": "complex-rule-challenge",
  "Priority": 3,
  "Action": {
    "Block": {}
  },
  "VisibilityConfig": {
    "SampledRequestsEnabled": true,
    "CloudWatchMetricsEnabled": true,
    "MetricName": "complex-rule-challenge"
  },
  "Statement": {
    "OrStatement": {
      "Statements": [
        {
          "AndStatement": {
            "Statements": [
              {
                "ByteMatchStatement": {
                  "FieldToMatch": {
                    "SingleHeader": {
                      "Name": "x-milkshake"
                    }
                  },
                  "PositionalConstraint": "EXACTLY",
                  "SearchString": "chocolate",
                  "TextTransformations": [
                    {
                      "Type": "NONE",
                      "Priority": 3
                    }
                  ]
                }
              },
              {
                "ByteMatchStatement": {
                  "FieldToMatch": {
                    "SingleHeader": {
                      "Name": "x-favourite-topping"
                    }
                  },
                  "PositionalConstraint": "EXACTLY",
                  "SearchString": "nuts",
                  "TextTransformations": [
                    {
                      "Type": "NONE",
                      "Priority": 3
                    }
                  ]
                }
              }
            ]
          }
        },
        {
          "AndStatement": {
            "Statements": [
              {
                "ByteMatchStatement": {
                  "FieldToMatch": {
                    "SingleQueryArgument": {
                      "Name": "milkshake"
                    }
                  },
                  "PositionalConstraint": "EXACTLY",
                  "SearchString": "banana",
                  "TextTransformations": [
                    {
                      "Type": "NONE",
                      "Priority": 3
                    }
                  ]
                }
              },
              {
                "ByteMatchStatement": {
                  "FieldToMatch": {
                    "SingleQueryArgument": {
                      "Name": "favourite-topping"
                    }
                  },
                  "PositionalConstraint": "EXACTLY",
                  "SearchString": "sauce",
                  "TextTransformations": [
                    {
                      "Type": "NONE",
                      "Priority": 3
                    }
                  ]
                }
              }
            ]
          }
        }
      ]
    }
  }
}
  • Xác nhận rule đã tạo thành công

Create the sample web app

  1. Chạy lệnh
# This will be allowed
curl -H "x-milkshake: chocolate" "<Your Juice Shop URL>"

Lệnh này sẽ cho phép chúng ta truy cập vào web Create the sample web app

  1. Chạy lệnh
# This will be allowed
curl  "<Your Juice Shop URL>?milkshake=banana"

Lệnh này sẽ cho phép chúng ta truy cập vào web Create the sample web app

  1. Chạy lệnh
# This will be blocked
curl -H "x-milkshake: chocolate" -H "x-favourite-topping: nuts" "<Your Juice Shop URL>"

Lệnh này sẽ bị chặn Create the sample web app

  1. Chạy lệnh
# This will be blocked
curl  "<Your Juice Shop URL>?milkshake=banana&favourite-topping=sauce"

Lệnh này sẽ bị chặn Create the sample web app

Ở phần này, bạn đã hiểu được cách để định nghĩa WAF rule ở định dạng JSON. Các logic phức tạp cần phải được định nghĩa sử dụng các toán tử AND, OR và NOT.