분석기 설정 사용자 정의
API 퍼징 동작은 CI/CD 변수를 통해 변경할 수 있습니다.
GitLab 13.12 이후, 기본 API 퍼징 구성 파일은 .gitlab/gitlab-api-fuzzing-config.yml
입니다. GitLab 14.0 이후, API 퍼징 구성 파일은 귀하의 리포지터리 루트가 아닌 .gitlab
디렉터리에 있어야 합니다.
인증
인증은 헤더나 쿠키로 인증 토큰을 제공하여 처리됩니다. 인증 흐름을 실행하거나 토큰을 계산하는 스크립트를 제공할 수 있습니다.
HTTP 기본 인증
HTTP 기본 인증은 HTTP 프로토콜에 기본으로 내장된 인증 방법으로 전송 계층 보안(TLS)과 함께 사용됩니다.
비밀번호를 위한 CI/CD 변수(예: TEST_API_PASSWORD
)를 만들고 마스킹 설정으로 설정하는 것을 권장합니다. GitLab 프로젝트 페이지의 설정 > CI/CD에서 CI/CD 변수를 만들 수 있습니다. 마스킹 된 변수의 제한 사항 때문에 변수를 추가하기 전에 비밀번호를 Base64로 인코딩해야 합니다.
마지막으로, .gitlab-ci.yml
파일에 두 개의 CI/CD 변수를 추가합니다:
-
FUZZAPI_HTTP_USERNAME
: 인증을 위한 사용자 이름. -
FUZZAPI_HTTP_PASSWORD_BASE64
: 인증을 위해 Base64로 인코딩된 비밀번호.
stages:
- fuzz
include:
- template: API-Fuzzing.gitlab-ci.yml
variables:
FUZZAPI_PROFILE: Quick-10
FUZZAPI_HAR: test-api-recording.har
FUZZAPI_TARGET_URL: http://test-deployment/
FUZZAPI_HTTP_USERNAME: testuser
FUZZAPI_HTTP_PASSWORD_BASE64: $TEST_API_PASSWORD
Raw password
비밀번호를 Base64로 인코딩하지 않거나 GitLab 15.3 이전 버전을 사용하는 경우, FUZZAPI_HTTP_PASSWORD_BASE64
대신 원시 비밀번호 FUZZAPI_HTTP_PASSWORD
를 제공할 수 있습니다.
Bearer 토큰
Bearer 토큰은 OAuth2 및 JSON Web Tokens (JWT)와 같은 여러 다양한 인증 메커니즘에서 사용됩니다. Bearer 토큰은 Authorization
HTTP 헤더를 사용하여 전송됩니다. API 퍼징에 Bearer 토큰을 사용하려면 다음 중 하나가 필요합니다:
- 만료되지 않는 토큰
- 테스트 기간 동안 유효한 토큰 생성 방법
- API 퍼징이 호출할 수 있는 토큰을 생성하는 Python 스크립트
토큰이 만료되지 않음
Bearer 토큰이 만료되지 않는 경우, FUZZAPI_OVERRIDES_ENV
변수를 사용하여 제공합니다. 이 변수의 내용은 API 퍼징의 발신 HTTP 요청에 추가할 헤더와 쿠키를 제공하는 JSON 스니펫입니다.
FUZZAPI_OVERRIDES_ENV
를 사용하여 베어러 토큰을 제공하려면 다음 단계를 따르세요:
-
예를 들어
{"headers":{"Authorization":"Bearer dXNlcm5hbWU6cGFzc3dvcmQ="}}
(귀하의 토큰으로 대체) 값을 가진TEST_API_BEARERAUTH
와 같은 CI/CD 변수를 만들어 주세요. GitLab 프로젝트 페이지의 설정 > CI/CD에서 CI/CD 변수를 만들 수 있습니다. -
.gitlab-ci.yml
파일에서FUZZAPI_OVERRIDES_ENV
를 방금 만든 변수로 설정합니다:stages: - fuzz include: - template: API-Fuzzing.gitlab-ci.yml variables: FUZZAPI_PROFILE: Quick-10 FUZZAPI_OPENAPI: test-api-specification.json FUZZAPI_TARGET_URL: http://test-deployment/ FUZZAPI_OVERRIDES_ENV: $TEST_API_BEARERAUTH
-
인증이 작동하는지 확인하려면 API 퍼징 테스트를 실행하고 퍼징 로그 및 테스트 API 응용 프로그램 로그를 확인하세요. 자세한 정보는 오버라이드 섹션을 참조하세요.
테스트 실행 중 생성된 토큰
Bearer 토큰이 생성되어 테스트 중에 만료되지 않는 경우, 토큰이 포함된 파일을 API 퍼징에 제공할 수 있습니다. 이 파일은 이전 단계 및 작업 또는 API 퍼징 작업의 일부에서 생성할 수 있습니다.
API 퍼징은 아래 구조의 JSON 파일을 받을 것으로 예상합니다:
{
"headers" : {
"Authorization" : "Bearer dXNlcm5hbWU6cGFzc3dvcmQ="
}
}
.gitlab-ci.yml
파일에서 FUZZAPI_OVERRIDES_FILE
를 설정하세요:
stages:
- fuzz
include:
- template: API-Fuzzing.gitlab-ci.yml
variables:
FUZZAPI_PROFILE: Quick
FUZZAPI_OPENAPI: test-api-specification.json
FUZZAPI_TARGET_URL: http://test-deployment/
FUZZAPI_OVERRIDES_FILE: api-fuzzing-overrides.json
인증이 작동하는지 확인하려면 API 퍼징 테스트를 실행하고 퍼징 로그 및 테스트 API 응용 프로그램 로그를 확인하세요.
토큰 만료 기간이 짧음
Bearer 토큰이 생성되어 테스트 완료 전에 만료되는 경우, API 퍼저가 제공한 간격에서 실행되는 프로그램 또는 스크립트를 제공할 수 있습니다. 제공된 스크립트는 Python 3 및 Bash가 설치된 Alpine Linux 컨테이너에서 실행됩니다. Python 스크립트가 추가 패키지를 필요로 하는 경우, 런타임에 패키지를 감지하고 설치해야 합니다.
스크립트는 특정 형식의 Bearer 토큰을 포함하는 JSON 파일을 작성해야 합니다:
{
"headers" : {
"Authorization" : "Bearer dXNlcm5hbWU6cGFzc3dvcmQ="
}
}
올바른 작동을 위해 3개의 CI/CD 변수를 제공해야 합니다:
-
FUZZAPI_OVERRIDES_FILE
: 제공된 명령어가 생성하는 JSON 파일. -
FUZZAPI_OVERRIDES_CMD
: JSON 파일을 생성하는 명령어. -
FUZZAPI_OVERRIDES_INTERVAL
: 명령을 실행하는 간격(초)입니다.
예를 들어:
stages:
- fuzz
include:
- template: API-Fuzzing.gitlab-ci.yml
variables:
FUZZAPI_PROFILE: Quick-10
FUZZAPI_OPENAPI: test-api-specification.json
FUZZAPI_TARGET_URL: http://test-deployment/
FUZZAPI_OVERRIDES_FILE: api-fuzzing-overrides.json
FUZZAPI_OVERRIDES_CMD: renew_token.py
FUZZAPI_OVERRIDES_INTERVAL: 300
인증이 작동하는지 확인하려면 API 퍼징 테스트를 실행하고 퍼징 로그 및 테스트 API 응용 프로그램 로그를 확인하세요.
API 퍼징 프로필
GitLab은 구성 파일 gitlab-api-fuzzing-config.yml
을 제공합니다. 이 파일에는 특정 횟수의 테스트를 수행하는 여러 테스트 프로필이 포함되어 있습니다. 각 프로필의 실행 시간은 테스트 수가 증가함에 따라 늘어납니다.
프로필 | Fuzz 테스트 (매개변수당) |
---|---|
Quick-10 | 10 |
Medium-20 | 20 |
Medium-50 | 50 |
Long-100 | 100 |
Overrides
API Fuzzing은 요청 내에서 특정 항목을 추가하거나 재정의하는 방법을 제공합니다. 예를 들어 다음과 같습니다.
- 헤더
- 쿠키
- 쿼리 문자열
- 폼 데이터
- JSON 노드
- XML 노드
이를 사용하여 의미 있는 버전 헤더, 인증 등을 삽입할 수 있습니다. 인증 섹션에는 해당 목적으로 재정의를 사용하는 예제가 포함되어 있습니다.
재정의는 각 재정의 유형이 JSON 객체로 표시되는 JSON 문서를 사용합니다.
{
"headers": {
"header1": "value",
"header2": "value"
},
"cookies": {
"cookie1": "value",
"cookie2": "value"
},
"query": {
"query-string1": "value",
"query-string2": "value"
},
"body-form": {
"form-param1": "value",
"form-param2": "value"
},
"body-json": {
"json-path1": "value",
"json-path2": "value"
},
"body-xml" : {
"xpath1": "value",
"xpath2": "value"
}
}
단일 헤더 설정의 예:
{
"headers": {
"Authorization": "Bearer dXNlcm5hbWU6cGFzc3dvcmQ="
}
}
헤더 및 쿠키를 모두 설정하는 예:
{
"headers": {
"Authorization": "Bearer dXNlcm5hbWU6cGFzc3dvcmQ="
},
"cookies": {
"flags": "677"
}
}
body-form
재정의 설정의 예:
{
"body-form": {
"username": "john.doe"
}
}
재정의 엔진은 요청 본문이 폼 데이터 콘텐츠만 있는 경우 body-form
을 사용합니다.
body-json
재정의 설정의 예:
{
"body-json": {
"$.credentials.access-token": "iddqd!42.$"
}
}
객체 body-json
의 각 JSON 속성 이름은 JSON Path 표현식으로 설정됩니다. JSON Path 표현식 $.credentials.access-token
은 값 iddqd!42.$
로 재정의할 노드를 식별합니다. 재정의 엔진은 요청 본문이 JSON 콘텐츠만 있는 경우 body-json
을 사용합니다.
예를 들어, 본문이 다음과 같이 설정된 경우:
{
"credentials" : {
"username" :"john.doe",
"access-token" : "non-valid-password"
}
}
다음과 같이 변경됩니다:
{
"credentials" : {
"username" :"john.doe",
"access-token" : "iddqd!42.$"
}
}
body-xml
재정의 설정의 예입니다. 첫 번째 항목은 XML 속성을, 두 번째 항목은 XML 요소를 재정의합니다.
{
"body-xml" : {
"/credentials/@isEnabled": "true",
"/credentials/access-token/text()" : "iddqd!42.$"
}
}
객체 body-xml
의 각 JSON 속성 이름은 XPath v2 표현식으로 설정됩니다. XPath 표현식 /credentials/@isEnabled
은 값 true
로 재정의할 속성 노드를 식별합니다. XPath 표현식 /credentials/access-token/text()
은 값 iddqd!42.$
로 재정의할 요소 노드를 식별합니다. 재정의 엔진은 요청 본문이 XML 콘텐츠만 있는 경우 body-xml
을 사용합니다.
예를 들어, 본문이 다음과 같이 설정된 경우:
<credentials isEnabled="false">
<username>john.doe</username>
<access-token>non-valid-password</access-token>
</credentials>
다음과 같이 변경됩니다:
<credentials isEnabled="true">
<username>john.doe</username>
<access-token>iddqd!42.$</access-token>
</credentials>
이 JSON 문서를 파일 또는 환경 변수로 제공할 수 있습니다. 또한 만료되는 값들을 지원하기 위해 일정 간격으로 명령을 실행할 수 있습니다.
파일 사용
FUZZAPI_OVERRIDES_FILE
CI/CD 변수를 설정하여 JSON을 파일로 제공하려면 해당 경로는 작업의 기본 작업 디렉터리를 기준으로 상대적입니다.
다음은 예시 .gitlab-ci.yml
입니다.
stages:
- fuzz
include:
- template: API-Fuzzing.gitlab-ci.yml
variables:
FUZZAPI_PROFILE: Quick
FUZZAPI_OPENAPI: test-api-specification.json
FUZZAPI_TARGET_URL: http://test-deployment/
FUZZAPI_OVERRIDES_FILE: api-fuzzing-overrides.json
CI/CD 변수 사용
재정의 JSON을 CI/CD 변수로 제공하려면 FUZZAPI_OVERRIDES_ENV
변수를 사용합니다.
이를 통해 변수로 JSON을 제공하고, 해당 변수들을 마스킹하고 보호할 수 있습니다.
다음은 예시 .gitlab-ci.yml
입니다. FUZZAPI_OVERRIDES_ENV
변수가 JSON으로 직접 설정됩니다:
stages:
- fuzz
include:
- template: API-Fuzzing.gitlab-ci.yml
variables:
FUZZAPI_PROFILE: Quick
FUZZAPI_OPENAPI: test-api-specification.json
FUZZAPI_TARGET_URL: http://test-deployment/
FUZZAPI_OVERRIDES_ENV: '{"headers":{"X-API-Version":"2"}}'
다음은 예시 .gitlab-ci.yml
입니다. SECRET_OVERRIDES
변수가 해당 JSON을 제공합니다. 이는 UI에서 정의된 그룹 또는 인스턴스 수준 CI/CD 변수입니다.
stages:
- fuzz
include:
- template: API-Fuzzing.gitlab-ci.yml
variables:
FUZZAPI_PROFILE: Quick
FUZZAPI_OPENAPI: test-api-specification.json
FUZZAPI_TARGET_URL: http://test-deployment/
FUZZAPI_OVERRIDES_ENV: $SECRET_OVERRIDES
명령어 사용
값이 생성되거나 만료될 때 다시 생성해야 하는 경우, API 퍼저가 지정된 간격으로 실행하는 프로그램 또는 스크립트를 제공할 수 있습니다. 제공된 스크립트는 파이썬 3과 Bash가 설치된 Alpine Linux 컨테이너에서 실행됩니다.
FUZZAPI_OVERRIDES_CMD
환경 변수를 실행하려는 프로그램 또는 스크립트로 설정해야 합니다. 제공된 명령은 이전에 정의된 대로 overrides JSON 파일을 생성합니다.
NodeJS 또는 Ruby와 같은 다른 스크립팅 런타임을 설치하거나, 오버라이드 명령에 대한 의존성을 설치해야 할 수 있습니다. 이 경우 FUZZAPI_PRE_SCRIPT
를 해당 전제 조건을 제공하는 스크립트의 파일 경로로 설정하는 것이 좋습니다. FUZZAPI_PRE_SCRIPT
로 제공된 스크립트는 분석기가 시작되기 전에 한 번 실행됩니다.
Alpine Linux 패키지 관리 페이지를 참조하여 Alpine Linux 패키지를 설치하는 방법에 대해 알아보세요.
올바른 작동을 위해 세 가지 CI/CD 변수를 제공해야 합니다.
-
FUZZAPI_OVERRIDES_FILE
: 제공된 명령에 의해 생성된 파일입니다. -
FUZZAPI_OVERRIDES_CMD
: overrides JSON 파일을 주기적으로 생성하는 명령입니다. -
FUZZAPI_OVERRIDES_INTERVAL
: 명령을 실행할 간격(초).
선택적으로:
-
FUZZAPI_PRE_SCRIPT
: 분석기가 시작되기 전에 런타임이나 의존성을 설치하는 스크립트입니다.
stages:
- fuzz
include:
- template: API-Fuzzing.gitlab-ci.yml
variables:
FUZZAPI_PROFILE: 빠른
FUZZAPI_OPENAPI: test-api-specification.json
FUZZAPI_TARGET_URL: http://test-deployment/
FUZZAPI_OVERRIDES_FILE: api-fuzzing-overrides.json
FUZZAPI_OVERRIDES_CMD: renew_token.py
FUZZAPI_OVERRIDES_INTERVAL: 300
overrides 디버깅
- GitLab 14.8에서 소개.
기본적으로 overrides 명령의 출력은 숨겨집니다. overrides 명령이 0이 아닌 종료 코드를 반환하면 해당 명령이 작업 결과의 일부로 표시됩니다. 선택적으로 FUZZAPI_OVERRIDES_CMD_VERBOSE
변수를 어떤 값으로 설정하여 생성되는 overrides 명령 출력을 표시할 수 있습니다. 이는 overrides 스크립트를 테스트할 때 유용하지만, 테스트 속도를 늦추므로 비활성화하는 것이 좋습니다.
또한 스크립트에서 작업이 완료되거나 실패한 경우 모음된 로그 파일에 메시지를 작성할 수 있습니다. 로그 파일은 특정 위치에 생성되어 특정한 규칙을 따르며 작업이 완료되거나 실패한 후 다운로드할 수 있는 아티팩트로 자동으로 포함됩니다.
위 예시에서 환경 변수 FUZZAPI_OVERRIDES_CMD
에 renew_token.py
를 제공했습니다. 스크립트에서 두 가지 사항을 주목하세요:
- 로그 파일은 환경 변수
CI_PROJECT_DIR
에 지정된 위치에 저장됩니다. - 로그 파일 이름은
gl-*.log
와 일치해야 합니다.
#!/usr/bin/env python
# Overrides 명령 예시
# Overrides 명령은 새로운 값으로 overrides JSON 파일을 업데이트할 수 있습니다.
# 테스트 중에 만료될 인증 토큰을 업데이트하기에 좋은 방법입니다.
# ...
# 끝
Overrides 명령 예시에서 Python 스크립트는 backoff
라이브러리에 의존합니다. Python 스크립트를 실행하기 전에 라이브러리가 설치되어 있는지 확인하려면 FUZZAPI_PRE_SCRIPT
를 overrides 명령의 의존성을 설치하는 스크립트로 설정하세요.
예를 들어, 다음은 user-pre-scan-set-up.sh
스크립트입니다.
#!/bin/bash
# user-pre-scan-set-up.sh
# python 의존성이 설치되어 있는지 확인
echo "**** python 의존성 설치 ****"
python3 -m ensurepip
pip3 install --no-cache --upgrade \
pip \
requests \
backoff
echo "**** python 의존성 설치 완료 ****"
# 끝
구성을 업데이트하여 FUZZAPI_PRE_SCRIPT
를 새로운 user-pre-scan-set-up.sh
스크립트로 설정해야 합니다. 예를 들어:
stages:
- fuzz
include:
- template: API-Fuzzing.gitlab-ci.yml
variables:
FUZZAPI_PROFILE: 빠른
FUZZAPI_OPENAPI: test-api-specification.json
FUZZAPI_TARGET_URL: http://test-deployment/
FUZZAPI_PRE_SCRIPT: user-pre-scan-set-up.sh
FUZZAPI_OVERRIDES_FILE: api-fuzzing-overrides.json
FUZZAPI_OVERRIDES_CMD: renew_token.py
FUZZAPI_OVERRIDES_INTERVAL: 300
이 전 예시에서 user-pre-scan-set-up.sh
스크립트를 사용하여 나중에 overrides 명령에서 사용할 새 런타임이나 응용 프로그램을 설치할 수 있습니다.
제외 경로
- GitLab 14.0에서 소개되었습니다.
API를 테스트할 때 특정 경로를 제외하는 것이 유용할 수 있습니다. 예를 들어, 인증 서비스나 API의 이전 버전 테스트를 제외하는 경우입니다. 경로를 제외하려면 .gitlab-ci.yml
파일에 지정된 FUZZAPI_EXCLUDE_PATHS
CI/CD 변수를 사용하면 됩니다. 여러 경로를 제외하려면 ;
문자로 항목을 구분하면 됩니다. 제공된 경로에서는 단일 문자 와일드카드 ?
와 다중 문자 와일드카드 *
를 사용할 수 있습니다.
제외된 경로가 올바르게 제외되었는지 확인하려면 작업 출력의 Tested Operations
및 Excluded Operations
부분을 검토하면 됩니다. Tested Operations
에 제외된 경로가 나열되어 있지 않아야 합니다.
2021-05-27 21:51:08 [INF] API 퍼징: --[ Tested Operations ]-------------------------
2021-05-27 21:51:08 [INF] API 퍼징: 201 POST http://target:7777/api/users CREATED
2021-05-27 21:51:08 [INF] API 퍼징: ------------------------------------------------
2021-05-27 21:51:08 [INF] API 퍼징: --[ Excluded Operations ]-----------------------
2021-05-27 21:51:08 [INF] API 퍼징: GET http://target:7777/api/messages
2021-05-27 21:51:08 [INF] API 퍼징: POST http://target:7777/api/messages
2021-05-27 21:51:08 [INF] API 퍼징: ------------------------------------------------
경로 제외 예시
이 예시는 /auth
리소스를 제외합니다. 이때 /auth/child
와 같은 하위 리소스는 제외되지 않습니다.
변수:
FUZZAPI_EXCLUDE_PATHS: /auth
/auth
및 하위 리소스(/auth/child
)를 제외하려면 와일드카드를 사용합니다.
변수:
FUZZAPI_EXCLUDE_PATHS: /auth*
여러 경로를 제외하려면 ;
문자를 사용하면 됩니다. 이 예시에서는 /auth*
와 /v1/*
를 제외합니다.
변수:
FUZZAPI_EXCLUDE_PATHS: /auth*;/v1/*
제외 매개변수
- GitLab 14.10에서 소개되었습니다.
API를 테스트하는 동안 (쿼리 문자열, 헤더 또는 본문 요소) 매개변수를 제외하려는 경우가 있습니다. 이는 매개변수가 항상 실패를 유발하거나 테스트를 느리게 만들거나 다른 이유로 인해 필요할 수 있습니다. 매개변수를 제외하기 위해 FUZZAPI_EXCLUDE_PARAMETER_ENV
또는 FUZZAPI_EXCLUDE_PARAMETER_FILE
중 하나의 변수를 사용할 수 있습니다.
FUZZAPI_EXCLUDE_PARAMETER_ENV
는 제외된 매개변수를 포함하는 JSON 문자열을 제공합니다. 이것은 JSON이 짧고 자주 변경되지 않는 경우 좋은 옵션입니다. 또 다른 옵션은 FUZZAPI_EXCLUDE_PARAMETER_FILE
변수를 사용하는 것입니다. 이 변수는 리포지터리에 체크되거나 다른 작업에서 생성된 파일 경로로 설정되거나 FUZZAPI_PRE_SCRIPT
를 사용하여 사전 스크립트에서 런타임으로 생성될 수 있습니다.
body-form
매개변수 제외
application/x-www-form-urlencoded
을 사용하는 요청에서 password
필드를 제외하려면 body-form
속성의 값을 필드 이름인 배열로 설정하세요 [ "password" ]
예를 들어, JSON 문서는 다음과 같습니다:
{
"body-form": [ "password" ]
}
요청이 콘텐츠 유형 application/x-www-form-urlencoded
를 사용할 때는 제외 매개변수가 body-form
를 사용합니다.
JSON 경로를 사용하여 특정 JSON 노드 제외
루트 객체에서 schema
속성을 제외하려면 body-json
속성의 값을 JSON Path 식인 배열로 설정하세요 [ "$.schema" ]
JSON 경로 식은 특수 구문을 사용하여 JSON 노드를 식별합니다. $
는 JSON 문서의 루트를 나타내며 .
은 현재 객체를 나타냅니다(우리의 경우 루트 객체). 그리고 schema
텍스트는 속성 이름을 나타냅니다. 따라서 JSON 경로 식 $.schema
은 루트 객체의 schema
속성을 나타냅니다.
예를 들어, JSON 문서는 다음과 같습니다:
{
"body-json": [ "$.schema" ]
}
요청이 콘텐츠 유형 application/json
를 사용할 때는 제외 매개변수가 body-json
를 사용합니다. 각 body-json
항목은 JSON 경로 식으로 구성되어야 합니다. JSON 경로에는 $
, *
, .
등의 문자가 특별한 의미를 가집니다.
JSON 경로를 사용하여 여러 개의 JSON 노드 제외
루트 수준의 users
배열의 각 항목에서 password
속성을 제외하려면 body-json
속성의 값을 JSON Path 식인 배열로 설정하세요 [ "$.users[*].paswword" ]
.
JSON 경로 식은 $
로 루트 노드를 참조한 다음, .
을 사용하여 현재 노드를 참조합니다. 그런 다음 users
를 사용하여 속성을 참조하고, 배열에서 원하는 인덱스를 지정하는 대신에 인덱스 대신 *
를 사용하여 임의의 인덱스를 지정합니다. 인덱스 참조 후 우리는 이제 배열에서 선택된 임의의 인덱스를 나타내는 .
을 찾고, 속성 이름 password
앞에 설명합니다.
예를 들어, JSON 문서는 다음과 같습니다:
{
"body-json": [ "$.users[*].paswword" ]
}
요청이 콘텐츠 유형 application/json
를 사용할 때는 제외 매개변수가 body-json
를 사용합니다. 각 body-json
항목은 JSON 경로 식으로 구성되어야 합니다. JSON 경로에는 $
, *
, .
등의 문자가 특별한 의미를 가집니다.
XML 속성 제외
credentials
루트 요소에 있는 isEnabled
이라는 속성을 제외하려면 body-xml
속성의 값을 XPath 표현식인 배열로 설정하세요 [ "/credentials/@isEnabled" ]
.
XPath 표현식 /credentials/@isEnabled
은 XML 문서의 루트를 나타내는 /
로 시작하고, 일치해야 하는 요소의 이름을 나타내는 credentials
가 그 뒤를 따릅니다. 이전 XML 요소의 노드를 참조하기 위해 /
을 사용하며, isEnable
이름이 속성임을 나타내기 위해 @
문자를 사용합니다.
예를 들어, JSON 문서는 다음과 같습니다:
{
"body-xml": [
"/credentials/@isEnabled"
]
}
요청이 콘텐츠 유형 application/xml
를 사용할 때는 제외 매개변수가 body-xml
를 사용합니다. 각 body-xml
항목은 XPath v2 표현식으로 구성되어야 합니다. XPath 표현식에는 @
, /
, :
, [
, ]
등의 문자가 특별한 의미를 가집니다.
JSON 문자열 사용하기
제외 JSON 문서를 제공하려면 변수 FUZZAPI_EXCLUDE_PARAMETER_ENV
에 JSON 문자열을 설정하세요. 다음 예에서 .gitlab-ci.yml
파일에서 FUZZAPI_EXCLUDE_PARAMETER_ENV
변수가 JSON 문자열로 설정됩니다:
stages:
- fuzz
include:
- template: API-Fuzzing.gitlab-ci.yml
variables:
FUZZAPI_PROFILE: Quick
FUZZAPI_OPENAPI: test-api-specification.json
FUZZAPI_TARGET_URL: http://test-deployment/
FUZZAPI_EXCLUDE_PARAMETER_ENV: '{ "headers": [ "Upgrade-Insecure-Requests" ] }'
파일 사용하기
제외 JSON 문서를 제공하려면 변수 FUZZAPI_EXCLUDE_PARAMETER_FILE
을 JSON 파일 경로로 설정하세요. 파일 경로는 작업의 현재 작업 디렉터리를 기준으로 상대적입니다. 다음 예제의 .gitlab-ci.yml
파일에서 FUZZAPI_EXCLUDE_PARAMETER_FILE
변수가 JSON 파일 경로로 설정됩니다:
stages:
- fuzz
include:
- template: API-Fuzzing.gitlab-ci.yml
variables:
FUZZAPI_PROFILE: Quick
FUZZAPI_OPENAPI: test-api-specification.json
FUZZAPI_TARGET_URL: http://test-deployment/
FUZZAPI_EXCLUDE_PARAMETER_FILE: api-fuzzing-exclude-parameters.json
api-fuzzing-exclude-parameters.json
은 제외 매개 변수 문서 구조를 따르는 JSON 문서입니다.
URL 제외하기
경로별로 제외하는 대신, FUZZAPI_EXCLUDE_URLS
CI/CD 변수를 사용하여 URL의 다른 컴포넌트별로 필터링할 수 있습니다. 이 변수는 .gitlab-ci.yml
파일에서 설정될 수 있습니다. 이 변수는 쉼표(,)로 구분된 여러 값들을 저장할 수 있습니다. 각 값은 정규 표현식입니다. 각 항목이 정규 표현식이므로 .*
와 같은 항목은 모든 것과 일치하는 정규 표현식입니다.
작업 출력에서 FUZZAPI_EXCLUDE_URLS
에서 제공된 정규 표현식과 일치하는 URL을 확인할 수 있습니다. 일치하는 작업은 제외된 작업 섹션에 나열됩니다. 제외된 작업에 나열된 작업은 테스트된 작업 섹션에 나열되어서는 안 됩니다. 예를 들어 다음 작업 출력 부분:
2021-05-27 21:51:08 [INF] API Fuzzing: --[ 테스트된 작업 ]-------------------------
2021-05-27 21:51:08 [INF] API Fuzzing: 201 POST http://target:7777/api/users CREATED
2021-05-27 21:51:08 [INF] API Fuzzing: ------------------------------------------------
2021-05-27 21:51:08 [INF] API Fuzzing: --[ 제외된 작업 ]-----------------------
2021-05-27 21:51:08 [INF] API Fuzzing: GET http://target:7777/api/messages
2021-05-27 21:51:08 [INF] API Fuzzing: POST http://target:7777/api/messages
2021-05-27 21:51:08 [INF] API Fuzzing: ------------------------------------------------
예제
URL 및 하위 리소스 제외하기
다음 예에서는 URL http://target/api/auth
및 해당 하위 리소스를 제외합니다.
stages:
- fuzz
include:
- template: API-Fuzzing.gitlab-ci.yml
variables:
FUZZAPI_TARGET_URL: http://target/
FUZZAPI_OPENAPI: test-api-specification.json
FUZZAPI_EXCLUDE_URLS: http://target/api/auth
두 URL 제외 및 하위 리소스 허용
http://target/api/buy
및 http://target/api/sell
URL을 제외하지만 하위 리소스인 http://target/api/buy/toy
또는 http://target/api/sell/chair
를 스캔할 수 있도록 하려면 http://target/api/buy/$,http://target/api/sell/$
값을 사용합니다. 이 값은 각각 쉼표(,) 문자로 구분된 두 개의 정규 표현식을 사용합니다. 따라서 http://target/api/buy$
와 http://target/api/sell$
를 포함합니다. 각 정규 표현식에는 일치하는 URL이 끝나는 지점을 가리키는 $
문자가 포함됩니다.
stages:
- fuzz
include:
- template: API-Fuzzing.gitlab-ci.yml
variables:
FUZZAPI_TARGET_URL: http://target/
FUZZAPI_OPENAPI: test-api-specification.json
FUZZAPI_EXCLUDE_URLS: http://target/api/buy/$,http://target/api/sell/$
두 URL 및 하위 리소스 제외하기
http://target/api/buy
및 http://target/api/sell
URL 및 해당 하위 리소스를 제외하려면 ,
문자를 사용하여 여러 URL을 제공합니다.
stages:
- fuzz
include:
- template: API-Fuzzing.gitlab-ci.yml
variables:
FUZZAPI_TARGET_URL: http://target/
FUZZAPI_OPENAPI: test-api-specification.json
FUZZAPI_EXCLUDE_URLS: http://target/api/buy,http://target/api/sell
정규 표현식을 사용하여 URL 제외하기
정확히 https://target/api/v1/user/create
및 https://target/api/v2/user/create
또는 기타 모든 버전(v3
, v4
등)을 제외하려면 https://target/api/v.*/user/create$
를 사용할 수 있습니다. 이전 정규 표현식에서:
-
.
는 임의의 문자를 나타냅니다. -
*
는 0회 이상 발생하는 것을 나타냅니다. -
$
는 URL이 여기서 끝나야 함을 나타냅니다.
stages:
- fuzz
include:
- template: API-Fuzzing.gitlab-ci.yml
variables:
FUZZAPI_TARGET_URL: http://target/
FUZZAPI_OPENAPI: test-api-specification.json
FUZZAPI_EXCLUDE_URLS: https://target/api/v.*/user/create$
헤더 퍼징
많은 기술 스택에서 발생하는 거짓 긍정이 많기 때문에 기본적으로 헤더 퍼징은 비활성화되어 있습니다. 헤더 퍼징을 활성화하려면 퍼징에 포함할 헤더 디렉터리을 지정해야 합니다.
기본 구성 파일의 각 프로필에는 GeneralFuzzingCheck
에 대한 항목이 있습니다. 이 체크는 헤더 퍼징을 수행합니다. Configuration
섹션 아래에서 HeaderFuzzing
및 Headers
설정을 변경하여 헤더 퍼징을 활성화해야 합니다.
다음 스니펫은 헤더 퍼징을 비활성화한 Quick-10
프로필의 기본 구성을 보여줍니다:
- Name: Quick-10
DefaultProfile: Empty
Routes:
- Route: *Route0
Checks:
- Name: FormBodyFuzzingCheck
Configuration:
FuzzingCount: 10
UnicodeFuzzing: true
- Name: GeneralFuzzingCheck
Configuration:
FuzzingCount: 10
UnicodeFuzzing: true
HeaderFuzzing: false
Headers:
- Name: JsonFuzzingCheck
Configuration:
FuzzingCount: 10
UnicodeFuzzing: true
- Name: XmlFuzzingCheck
Configuration:
FuzzingCount: 10
UnicodeFuzzing: true
HeaderFuzzing
은 헤더 퍼징을 켜거나 끄는 부울 값입니다. 기본 설정은 끄기(false
)입니다. 헤더 퍼징을 켜려면 이 설정을 true
로 변경하세요:
- Name: GeneralFuzzingCheck
Configuration:
FuzzingCount: 10
UnicodeFuzzing: true
HeaderFuzzing: true
Headers:
Headers
는 퍼징할 헤더의 디렉터리입니다. 나열된 헤더만 퍼집니다. API에서 사용하는 헤더를 퍼집으려면 - Name: HeaderName
구문을 사용하여 해당 헤더에 대한 항목을 추가하세요. 예를 들어, 사용자 지정 헤더 X-Custom
을 퍼집하려면 - Name: X-Custom
을 추가하세요:
- Name: GeneralFuzzingCheck
Configuration:
FuzzingCount: 10
UnicodeFuzzing: true
HeaderFuzzing: true
Headers:
- Name: X-Custom
이제 X-Custom
헤더를 퍼집하는 구성이 준비되었습니다. 추가 헤더를 나열하려면 동일한 표기법을 사용하세요:
- Name: GeneralFuzzingCheck
Configuration:
FuzzingCount: 10
UnicodeFuzzing: true
HeaderFuzzing: true
Headers:
- Name: X-Custom
- Name: X-AnotherHeader
필요한 프로필마다 이 구성을 반복하세요.