
다양한 API 보안 도구와 WAF의 탐지 로직 및 우회 방법을 평가하기 위한 Golang 기반 오픈소스 프로젝트
GoTestWAF는 REST, GraphQL, gRPC, SOAP, XMLRPC 등을 포함한 다양한 API 프로토콜을 지원하는 API 및 OWASP 공격 시뮬레이션 도구입니다.
웹 애플리케이션 보안 솔루션(API 보안 프록시, 웹 애플리케이션 방화벽(WAF), IPS, API 게이트웨이 등)을 평가하기 위해 설계되었습니다.
GoTestWAF는 HTTP 요청의 여러 부분(본문, 헤더, URL 매개변수 등)에 인코딩된 페이로드를 배치하여 악성 요청을 생성합니다. 생성된 요청은 GoTestWAF 실행 시 지정된 애플리케이션 보안 솔루션 URL로 전송됩니다. 보안 솔루션 평가 결과는 사용자 머신에 생성된 보고서 파일에 기록됩니다.
요청 생성의 기본 조건은 다음 형식의 YAML 파일로 testcases 폴더에 정의되어 있습니다:```yaml
payload:
* `payload`는 악성 공격 샘플입니다 (예: XSS 페이로드 ```<script>alert(111)</script>``` 또는 더 정교한 것).
페이로드에 YAML 문자열 형식이 필요하므로 [이진 데이터로 인코딩](https://yaml.org/type/binary.html)되어야 합니다.
* `encoder`는 페이로드를 HTTP 요청에 배치하기 전에 적용할 인코더입니다. 가능한 인코더:
* Base64
* Base64Flat
* JSUnicode
* URL
* Plain (페이로드 문자열을 그대로 유지)
* XML Entity
* `placeholder`는 인코딩된 페이로드가 위치해야 하는 HTTP 요청 내부의 위치입니다. 가능한 플레이스홀더:
* gRPC
* Header
* UserAgent
* RequestBody
* JSONRequest
* JSONBody
* HTMLForm
* HTMLMultipartForm
* SOAPBody
* XMLBody
* URLParam
* URLPath
* RawRequest
`RawRequest` 플레이스홀더를 사용하면 임의의 HTTP 요청을 수행할 수 있습니다. 페이로드는 URL 경로, 헤더 또는 본문에서 문자열 `{{payload}}`를 대체하여 대체됩니다. `RawRequest` 플레이스홀더의 필드:
* `method`
* `path`
* `headers`
* `body`
`RawRequest` 플레이스홀더의 필수 필드:
* `method` 필드
예시:
```yaml
payload:
- test
encoder:
- Plain
placeholder:
- RawRequest:
method: "POST"
path: "/"
headers:
Content-Type: "multipart/form-data; boundary=boundary"
body: |
--boundary
Content-disposition: form-data; name="field1"
Test
--boundary
Content-disposition: form-data; name="field2"
Content-Type: text/plain; charset=utf-7
Knock knock.
{{payload}}
--boundary--
type: RawRequest test
```
* `type`은 파일에 있는 페이로드 전체 그룹의 이름입니다. 임의로 지정할 수 있지만 파일 내 공격 유형을 반영해야 합니다.
요청 생성은 페이로드 수에 인코더 및 플레이스홀더 수를 곱하는 3단계 프로세스입니다.
2개의 **페이로드**, 3개의 **인코더**(Base64, JSUnicode, URL) 및 1개의 **플레이스홀더**(URLParameter - HTTP GET 매개변수)를 정의했다고 가정해 보겠습니다.
이 경우 GoTestWAF는 테스트 케이스에서 2x3x1 = 6개의 요청을 전송합니다.
GoTestWAF 실행 중에 OWASP Top-10, OWASP-API 또는 자체 테스트 케이스([구성 옵션](#configuration-options) `testCasePath` 사용) 중에서 테스트 케이스를 선택할 수도 있습니다.
## 요구 사항
* GoTestwaf는 모든 인기 운영 체제(Linux, Windows, macOS)를 지원하며, 시스템에 [Go](https://golang.org/doc/install)가 설치되어 있으면 네이티브로 빌드할 수 있습니다. GoTestWaf를 네이티브로 실행하려면 PDF 보고서를 생성할 수 있도록 Chrome 웹 브라우저가 설치되어 있는지 확인하십시오. Chrome이 없는 경우 HTML 형식으로 보고서를 만들 수 있습니다.
* Docker 컨테이너로 GoTestWAF를 실행하는 경우 [Docker를 설치 및 구성](https://docs.docker.com/get-docker/)하고 GoTestWAF와 평가 대상 애플리케이션 보안 솔루션이 동일한 [Docker 네트워크](https://docs.docker.com/network/)에 연결되어 있는지 확인하십시오.
* GoTestWAF가 성공적으로 시작되려면 GoTestWAF를 실행하는 시스템의 IP 주소가 애플리케이션 보안 솔루션을 실행하는 시스템에서 허용 목록에 등록되어 있는지 확인하십시오.
## Docker로 빠른 시작
아래 단계에서는 최소 구성으로 Docker에서 GoTestWAF를 다운로드하고 시작하는 방법을 안내합니다.
1. Docker Hub에서 [GoTestWAF 이미지](https://hub.docker.com/r/wallarm/gotestwaf)를 가져옵니다:
```
docker pull wallarm/gotestwaf
```
2. GoTestWAF 이미지를 시작합니다:
```sh
docker run --rm --network="host" -it -v ${PWD}/reports:/app/reports \
wallarm/gotestwaf --url=<EVALUATED_SECURITY_SOLUTION_URL>
```
필요한 경우 `${PWD}/reports`를 평가 보고서를 저장할 다른 폴더 경로로 바꿀 수 있습니다.
보고서를 선택적으로 이메일로 보내지 않으려면 이메일 요청 메시지가 나타나면 Enter 키를 누르거나 `--noEmailReport`를 사용하여 메시지를 건너뛸 수 있습니다:
```sh
docker run --rm --network="host" -v ${PWD}/reports:/app/reports \
wallarm/gotestwaf --url=<EVALUATED_SECURITY_SOLUTION_URL> --noEmailReport
```
평가 대상 보안 도구가 외부에서 액세스 가능한 경우 `--network="host"` 옵션을 생략할 수 있습니다. 이 옵션은 127.0.0.1에서 실행되는 Docker 컨테이너 간의 상호 작용을 활성화합니다.
gRPC 테스트를 수행하려면 작동 중인 엔드포인트가 있어야 하며 `--grpcPort <port>` cli 옵션을 사용해야 합니다.
```sh
docker run --rm --network="host" -it -v ${PWD}/reports:/app/reports \
wallarm/gotestwaf --grpcPort 9000 --url=http://my.grpc.endpoint
```
3. 보고서를 위해 이메일을 확인하십시오.
최소 구성으로 GoTestWAF를 사용하여 애플리케이션 보안 솔루션을 성공적으로 평가했습니다.
고급 구성 옵션을 알아보려면 이 [링크](#configuration-options)를 사용하십시오.
## 평가 결과 확인
`STDOUT` 및 `STDERR` 서비스를 사용하여 기록된 평가 결과를 확인합니다. 예를 들어:```
INFO[0000] GoTestWAF started version=v0.5.6-7-g48e6959
INFO[0000] Test cases loading started
INFO[0000] Test cases loading finished
INFO[0000] Test cases fingerprint fp=c6d14d6138601d19d215bb97806bcda3
INFO[0000] Try to identify WAF solution
INFO[0000] WAF was not identified
INFO[0000] gohttp is used as an HTTP client to make requests http_client=gohttp
INFO[0000] WAF pre-check url="http://host.docker.internal:8080"
INFO[0000] WAF pre-check blocked=true code=403 status=done
INFO[0000] gRPC pre-check status=started
INFO[0000] gRPC pre-check connection="not available" status=done
INFO[0000] GraphQL pre-check status=started
INFO[0000] GraphQL pre-check connection="not available" status=done
INFO[0000] Scanning started url="http://host.docker.internal:8080"
INFO[0005] Scanning finished duration=5.422700876s
True-Positive Tests:
┌────────────┬───────────────────────────┬──────────────────────┬─────────────────────┬──────────────────────┬────────────────────┬─────────────┬─────────────────┐
│ TEST SET │ TEST CASE │ PERCENTAGE , % │ BLOCKED │ BYPASSED │ UNRESOLVED │ SENT │ FAILED │
├────────────┼───────────────────────────┼──────────────────────┼─────────────────────┼──────────────────────┼────────────────────┼─────────────┼─────────────────┤
│ community │ community-128kb-rce │ 0.00 │ 0 │ 0 │ 1 │ 1 │ 0 │
│ community │ community-128kb-sqli │ 0.00 │ 0 │ 0 │ 1 │ 1 │ 0 │
│ community │ community-128kb-xss │ 0.00 │ 0 │ 0 │ 1 │ 1 │ 0 │
│ community │ community-16kb-rce │ 100.00 │ 1 │ 0 │ 0 │ 1 │ 0 │
│ community │ community-16kb-sqli │ 100.00 │ 1 │ 0 │ 0 │ 1 │ 0 │
│ community │ community-16kb-xss │ 100.00 │ 1 │ 0 │ 0 │ 1 │ 0 │
│ community │ community-32kb-rce │ 100.00 │ 1 │ 0 │ 0 │ 1 │ 0 │
│ community │ community-32kb-sqli │ 100.00 │ 1 │ 0 │ 0 │ 1 │ 0 │
│ community │ community-32kb-xss │ 100.00 │ 1 │ 0 │ 0 │ 1 │ 0 │
│ community │ community-64kb-rce │ 100.00 │ 1 │ 0 │ 0 │ 1 │ 0 │
│ community │ community-64kb-sqli │ 100.00 │ 1 │ 0 │ 0 │ 1 │ 0 │
│ community │ community-64kb-xss │ 100.00 │ 1 │ 0 │ 0 │ 1 │ 0 │
│ community │ community-8kb-rce │ 100.00 │ 1 │ 0 │ 0 │ 1 │ 0 │
│ community │ community-8kb-sqli │ 100.00 │ 1 │ 0 │ 0 │ 1 │ 0 │
│ community │ community-8kb-xss │ 100.00 │ 1 │ 0 │ 0 │ 1 │ 0 │
│ community │ community-lfi │ 100.00 │ 8 │ 0 │ 0 │ 8 │ 0 │
│ community │ community-lfi-multipart │ 0.00 │ 0 │ 0 │ 2 │ 2 │ 0 │
│ community │ community-rce │ 50.00 │ 2 │ 2 │ 0 │ 4 │ 0 │
│ community │ community-rce-rawrequests │ 100.00 │ 3 │ 0 │ 0 │ 3 │ 0 │
│ community │ community-sqli │ 100.00 │ 12 │ 0 │ 0 │ 12 │ 0 │
│ community │ community-user-agent │ 66.67 │ 6 │ 3 │ 0 │ 9 │ 0 │
│ community │ community-xss │ 88.46 │ 92 │ 12 │ 0 │ 104 │ 0 │
│ community │ community-xxe │ 0.00 │ 0 │ 1 │ 1 │ 2 │ 0 │
│ owasp │ crlf │ 85.71 │ 6 │ 1 │ 0 │ 7 │ 0 │
│ owasp │ ldap-injection │ 8.33 │ 2 │ 22 │ 0 │ 24 │ 0 │
│ owasp │ mail-injection │ 12.50 │ 3 │ 21 │ 0 │ 24 │ 0 │
│ owasp │ nosql-injection │ 24.00 │ 12 │ 38 │ 0 │ 50 │ 0 │
│ owasp │ path-traversal │ 30.00 │ 6 │ 14 │ 0 │ 20 │ 0 │
│ owasp │ rce │ 33.33 │ 2 │ 4 │ 0 │ 6 │ 0 │
│ owasp │ rce-urlparam │ 33.33 │ 3 │ 6 │ 0 │ 9 │ 0 │
│ owasp │ rce-urlpath │ 0.00 │ 0 │ 3 │ 0 │ 3 │ 0 │
│ owasp │ shell-injection │ 18.75 │ 6 │ 26 │ 0 │ 32 │ 0 │
│ owasp │ sql-injection │ 29.17 │ 14 │ 34 │ 0 │ 48 │ 0 │
│ owasp │ ss-include │ 50.00 │ 12 │ 12 │ 0 │ 24 │ 0 │
│ owasp │ sst-injection │ 29.17 │ 7 │ 17 │ 0 │ 24 │ 0 │
│ owasp │ xml-injection │ 0.00 │ 0 │ 7 │ 0 │ 7 │ 0 │
│ owasp │ xss-scripting │ 39.91 │ 89 │ 134 │ 1 │ 224 │ 0 │
│ owasp-api │ graphql │ 0.00 │ 0 │ 0 │ 0 │ 0 │ 0 │
│ owasp-api │ graphql-post │ 0.00 │ 0 │ 0 │ 0 │ 0 │ 0 │
│ owasp-api │ grpc │ 0.00 │ 0 │ 0 │ 0 │ 0 │ 0 │
│ owasp-api │ non-crud │ 100.00 │ 2 │ 0 │ 0 │ 2 │ 0 │
│ owasp-api │ rest │ 42.86 │ 3 │ 4 │ 0 │ 7 │ 0 │
│ owasp-api │ soap │ 20.00 │ 1 │ 4 │ 0 │ 5 │ 0 │
├────────────┼───────────────────────────┼──────────────────────┼─────────────────────┼──────────────────────┼────────────────────┼─────────────┼─────────────────┤
│ Date: │ Project Name: │ True-Positive Score: │ Blocked (Resolved): │ Bypassed (Resolved): │ Unresolved (Sent): │ Total Sent: │ Failed (Total): │
│ 2025-07-14 │ generic │ 45.36% │ 303/668 (45.36%) │ 365/668 (54.64%) │ 7/675 (1.04%) │ 675 │ 0/675 (0.00%) │
└────────────┴───────────────────────────┴──────────────────────┴─────────────────────┴──────────────────────┴────────────────────┴─────────────┴─────────────────┘
True-Negative Tests:
┌────────────┬───────────────┬──────────────────────┬─────────────────────┬──────────────────────┬────────────────────┬─────────────┬─────────────────┐
│ TEST SET │ TEST CASE │ PERCENTAGE , % │ BLOCKED │ BYPASSED │ UNRESOLVED │ SENT │ FAILED │
├────────────┼───────────────┼──────────────────────┼─────────────────────┼──────────────────────┼────────────────────┼─────────────┼─────────────────┤
│ false-pos │ texts │ 90.78 │ 13 │ 128 │ 0 │ 141 │ 0 │
├────────────┼───────────────┼──────────────────────┼─────────────────────┼──────────────────────┼────────────────────┼─────────────┼─────────────────┤
│ Date: │ Project Name: │ True-Negative Score: │ Blocked (Resolved): │ Bypassed (Resolved): │ Unresolved (Sent): │ Total Sent: │ Failed (Total): │
│ 2025-07-14 │ generic │ 90.78% │ 13/141 (9.22%) │ 128/141 (90.78%) │ 0/141 (0.00%) │ 141 │ 0/141 (0.00%) │
└────────────┴───────────────┴──────────────────────┴─────────────────────┴──────────────────────┴────────────────────┴─────────────┴─────────────────┘
Summary:
┌──────────────────────┬───────────────────────────────┬──────────────────────────────┬─────────┐
│ TYPE │ TRUE - POSITIVE TESTS BLOCKED │ TRUE - NEGATIVE TESTS PASSED │ AVERAGE │
├──────────────────────┼───────────────────────────────┼──────────────────────────────┼─────────┤
│ API Security │ 42.86% │ n/a │ 42.86% │
│ Application Security │ 45.41% │ 90.78% │ 68.10% │
├──────────────────────┼───────────────────────────────┼──────────────────────────────┼─────────┤
│ │ │ Score │ 55.48% │
└──────────────────────┴───────────────────────────────┴──────────────────────────────┴─────────┘
보고서 파일인 waf-evaluation-report-<date>.pdf는 사용자 디렉토리의 reports 폴더에서 확인할 수 있습니다. 또한 reportPath 매개변수로 보고서를 저장할 디렉토리를, reportName 매개변수로 보고서 파일명을 지정할 수 있습니다. 고급 구성 옵션을 알아보려면 이 링크를 참조하세요.
PDF 보고서 예시는 여기에서 확인할 수 있습니다.

데모 환경을 실행하여 GoTestWAF를 체험할 수 있습니다. 이 데모 환경은 NGINX 기반의 OWASP Core Rule Set을 사용하는 ModSecurity를 배포하고, GoTestWAF가 Docker에서 ModSecurity를 평가합니다.
데모 환경을 실행하려면:
이 저장소를 클론하고 클론한 디렉토리로 이동합니다:
git clone https://github.com/wallarm/gotestwaf.git
cd gotestwaf
다음 make 명령어를 사용하여 Docker 이미지에서 ModSecurity를 시작합니다:
make modsec
ModSecurity Docker 컨테이너 실행을 위한 설정은 클론된 Makefile의 modsec 규칙에 정의되어 있습니다. 이 규칙은 클론된 파일 ./resources/default.conf.template에 정의된 최소 구성과 PARANOIA 값을 1로 설정하여 ModSecurity Docker 컨테이너를 8080 포트에서 실행합니다.
필요한 경우 클론된 Makefile에서 modsec 규칙을 편집하여 이 설정을 변경할 수 있습니다. ModSecurity 구성에 사용 가능한 옵션은 Docker Hub에 설명되어 있습니다.
ModSecurity 컨테이너를 중지하려면 다음 명령어를 사용하세요:
make modsec_down
다음 방법 중 하나를 사용하여 최소 구성으로 GoTestWAF를 시작합니다:
다음 docker pull 및 docker run 명령어를 사용하여 Docker 이미지를 시작합니다:
Docker Hub에서 다운로드한 GoTestWAF Docker 이미지를 실행하는 것 외에도, 다음 옵션을 사용하여 GoTestWAF를 실행할 수 있습니다:
이 저장소를 클론하고 Dockerfile에서 GoTestWAF Docker 이미지를 빌드합니다. 예시:
git clone https://github.com/wallarm/gotestwaf.git
cd gotestwaf
DOCKER_BUILDKIT=1 docker build --force-rm -t gotestwaf .
docker run --rm --network="host" -it -v ${PWD}/reports:/app/reports \
gotestwaf --url=<EVALUATED_SECURITY_SOLUTION_URL>
평가 대상 보안 도구가 외부에서 접근 가능한 경우 --network="host" 옵션을 생략할 수 있습니다. 이 옵션은 127.0.0.1에서 실행 중인 Docker 컨테이너 간 상호 작용을 가능하게 합니다.
이 저장소를 클론하고 go로 GoTestWAF를 실행합니다. 예시:
git clone https://github.com/wallarm/gotestwaf.git
cd gotestwaf
go run ./cmd --url=<EVALUATED_SECURITY_SOLUTION_URL>
이 저장소를 클론하고 Go 모듈로 GoTestWAF를 빌드합니다:
git clone https://github.com/wallarm/gotestwaf.git
cd gotestwaf
go build -mod vendor -o gotestwaf ./cmd
지원되는 GoTestWAF 구성 옵션은 아래에 설명되어 있습니다.
Usage: ./gotestwaf [OPTIONS] --url
Options: --addDebugHeader Add header "X-GoTestWAF-Test" with a hash of the test information in each request --addHeader string An HTTP header to add to requests --blockConnReset If present, connection resets will be considered as block --blockRegex string Regex to detect a blocking page with the same HTTP response status code as a not blocked request --blockStatusCodes ints HTTP status code that WAF uses while blocking requests (default [403]) --configPath string Path to the config file (default "config.yaml") --email string E-mail to which the report will be sent --followCookies If present, use cookies sent by the server. May work only with --maxIdleConns=1 (gohttp only) --graphqlURL string GraphQL URL to check --grpcPort uint16 gRPC port to check --hideArgsInReport If present, GoTestWAF CLI arguments will not be displayed in the report --httpClient string Which HTTP client use to send requests: chrome, gohttp (default "gohttp") --idleConnTimeout int The maximum amount of time a keep-alive connection will live (gohttp only) (default 2) --ignoreUnresolved If present, unresolved test cases will be considered as bypassed (affect score and results) --includePayloads If present, payloads will be included in HTML/PDF report --logFormat string Set logging format: text, json (default "text") --logLevel string Logging level: panic, fatal, error, warn, info, debug, trace (default "info") --maxIdleConns int The maximum number of keep-alive connections (gohttp only) (default 2) --maxRedirects int The maximum number of handling redirects (gohttp only) (default 50) --noEmailReport Save report locally --nonBlockedAsPassed If present, count requests that weren't blocked as passed. If false, requests that don't satisfy to PassStatusCodes/PassRegExp as blocked --openapiFile string Path to openAPI file --passRegex string Regex to a detect normal (not blocked) web page with the same HTTP status code as a blocked request --passStatusCodes ints HTTP response status code that WAF uses while passing requests (default [200,404]) --proxy string Proxy URL to use --quiet If present, disable verbose logging --randomDelay int Random delay in ms in addition to the delay between requests (default 400) --renewSession Renew cookies before each test. Should be used with --followCookies flag (gohttp only) --reportFormat strings Export report in the following formats: none, json, html, pdf (default [pdf]) --reportName string Report file name. Supports `time' package template format (default "waf-evaluation-report-2006-January-02-15-04-05") --reportPath string A directory to store reports (default "reports") --sendDelay int Delay in ms between requests (default 400) --skipWAFBlockCheck If present, WAF detection tests will be skipped --skipWAFIdentification Skip WAF identification --testCase string If set then only this test case will be run --testCasesPath string Path to a folder with test cases (default "testcases") --testSet string If set then only this test set's cases will be run --tlsVerify If present, the received TLS certificate will be verified --url string URL to check --version Show GoTestWAF version and exit --wafName string Name of the WAF product (default "generic") --workers int The number of workers to scan (default 5)
GoTestWAF는 요청을 수행하기 위해 두 가지 HTTP 클라이언트를 지원하며, `--httpClient` 옵션을 통해 선택할 수 있습니다. 기본 클라이언트는 표준 Golang HTTP 클라이언트입니다. 두 번째 옵션은 Chrome이며, `--httpClient=chrome` CLI 인수를 사용하여 사용할 수 있습니다. Linux 시스템에서는 Docker 인수에 `--cap-add=SYS_ADMIN` 인수를 추가하여 Chrome을 요청 수행자로 사용하여 GoTestWAF를 실행해야 합니다.
### OpenAPI 파일 기반 스캔
더 나은 스캔을 위해 GTW는 유효한 애플리케이션 요청을 통해 악성 벡터를 전송하는 것을 지원합니다. 단순한 구조의 요청을 구성하여 시작 시 지정된 URL로 전송하는 대신, GoTestWAF는 OpenAPI 3.0 형식의 애플리케이션 API 설명을 기반으로 유효한 요청을 생성합니다.
작동 방식:
1. GoTestWAF는 OpenAPI 파일을 로드하고 요청 템플릿을 구성합니다. 그런 다음 모든 템플릿은 지원하는 플레이스홀더에 따라 그룹으로 나뉩니다 (예: 요청 경로에 문자열 매개변수가 있으면 해당 요청은 URLPath 플레이스홀더를 지원하는 요청 그룹에 할당됩니다).
2. 전송을 위해 대기열에서 다음 악성 벡터가 선택됩니다. 지정된 플레이스홀더를 기반으로 이 벡터가 대체될 수 있는 모든 쿼리 템플릿이 선택됩니다. 그런 다음 벡터가 템플릿에 대체되고 요청이 전송됩니다.
3. OpenAPI 파일에 지정된 가능한 응답을 기반으로 요청이 WAF에 의해 차단되었는지 또는 애플리케이션에 전달되었는지가 결정됩니다. 응답 코드의 상태 및 스키마가 OpenAPI 파일에 설명된 것과 일치하면 요청은 우회된 것으로 표시됩니다. 그렇지 않으면 차단된 것으로 표시됩니다. 애플리케이션이 상태 코드로만 응답하고, 이 상태 코드가 WAF의 응답과 일치할 수 있습니다. 이 경우 요청은 미해결로 표시됩니다.
지원되는 일부 OpenAPI 기능:
* 헤더, 경로, 쿼리 매개변수 및 요청 본문의 숫자 및 문자열 매개변수;
* 요청 본문에 대해 다음 콘텐츠 유형이 지원됩니다: `application/json`, `application/xml`, `application/x-www-form-urlencoded`, `text/plain`;
* XML에 대해 다음 수정자가 지원됩니다: `name`, `wrapped`, `attribute`, `prefix`, `namespace`;
* 문자열의 길이 제한은 `minLength` 및 `maxLength` 매개변수를 통해 지원됩니다;
* 숫자의 값 제한은 `minimum`, `maximum`, `exclusiveMinimum` 및 `exclusiveMaximum`을 통해 지원됩니다;
* 배열 길이 제한은 `minItems` 및 `maxItems`를 통해 지원됩니다;
* `oneOf`, `anyOf`, `allOf`를 통한 스키마 조합이 지원됩니다.
설명된 작동 원리에 따라 OpenAPI 파일이 구현된 애플리케이션 API를 올바르게 나타내는 것이 매우 중요합니다. 따라서 예를 들어 `default`를 사용하여 쿼리에 대한 가능한 응답을 설명할 수 없습니다.
참고: GoTestWAF 컨테이너에 OpenAPI 사양이 포함된 볼륨을 전달해야 합니다.```sh
-v ${PWD}/api.yaml:/app/api.yaml
전체 Docker 예제:```sh docker run --rm --network="host" -it -v ${PWD}/reports:/app/reports -v ${PWD}/api.yaml:/app/api.yaml wallarm/gotestwaf --wafName your_waf_name --url=https://example.com/v1 --openapiFile api.yaml
## OWASP Core Rule Set 회귀 테스트 스위트로 실행하기
GoTestWAF는 추가 테스트 스위트의 손쉬운 통합을 지원합니다.
이 예제에서는 OWASP Core Rule Set 회귀 테스트 스위트의 테스트를 추가하는 방법을 설명합니다.
테스트가 GoTestWAF 형식과 다른 형식으로 작성되어 있으므로 변환이 필요합니다. 이를 위해 **misc/modsec_regression_testset_converter.rb** 스크립트가 제공됩니다.
테스트를 변환하려면 `make modsec_crs_regression_tests_convert`를 실행하세요.
그런 다음 업데이트된 테스트 세트로 컨테이너를 빌드합니다.
`make gotestwaf`
기본적으로 테스트는 일부 규칙 하위 집합에 대해서만 변환됩니다. 다음 카테고리가 선택되었습니다:
- REQUEST-932-APPLICATION-ATTACK-RCE
- REQUEST-933-APPLICATION-ATTACK-PHP
- REQUEST-941-APPLICATION-ATTACK-XSS
- REQUEST-930-APPLICATION-ATTACK-LFI
- REQUEST-931-APPLICATION-ATTACK-RFI
- REQUEST-942-APPLICATION-ATTACK-SQLI
- REQUEST-944-APPLICATION-ATTACK-JAVA
- REQUEST-934-APPLICATION-ATTACK-GENERIC
- REQUEST-913-SCANNER-DETECTION
필요한 경우 misc/modsec_regression_testset_converter.rb에서 변수 "crs_testcases"를 수정하여 테스트 카테고리를 추가하거나 제거할 수 있습니다.
docker pull wallarm/gotestwaf
docker run --rm --network="host" -v ${PWD}/reports:/app/reports \
wallarm/gotestwaf --url=http://127.0.0.1:8080 --noEmailReport
Dockerfile에서 GoTestWAF Docker 이미지를 빌드하고 다음 make 명령어로 이미지를 실행합니다 (ModSec이 8080 포트에서 실행 중인지 확인하고, 그렇지 않으면 Makefile에서 포트 값을 업데이트하세요):
make gotestwaf
make scan_local_from_docker
다음 make 명령어를 사용하여 Go로 GoTestWAF를 네이티브로 시작합니다: (ModSec이 8080 포트에서 실행 중인지 확인하고, 그렇지 않으면 Makefile에서 포트 값을 업데이트하세요):
make scan_local
컨테이너 내부의 /app/reports에 매핑한 reports 폴더에서 waf-evaluation-report-<date>.pdf 보고서 파일을 찾습니다.