DAST: 동적 안전 테스트란 무엇입니까?
DAST(동적 애플리케이션 보안 테스트) 테스트하는 분석 기술 애플리케이션을 실행하고 외부에서 실제 공격을 시뮬레이션합니다. SAST와 달리 소스 코드를 분석하면 DAST는 HTTP를 통해 애플리케이션과 상호 작용합니다. 공격자는 XSS, SQL 주입, CSRF, 잘못된 구성 및 인증이 깨졌습니다.
DAST는 접근 방식입니다 블랙박스: 소스 코드에 접근할 수 없으며 볼 수 있습니다. 악의적인 사용자가 보는 것과 똑같은 응용 프로그램입니다. 이는 SAST를 보완합니다. 구성 문제와 같이 런타임에만 나타나는 취약점을 발견하기 때문입니다. HTTP 헤더가 누락되고 인증 흐름이 안전하지 않습니다.
이 기사에서는 파이프라인에 통합된 OWASP ZAP 및 Burp Suite를 살펴보겠습니다. 릴리스 주기를 늦추지 않고 자동화된 DAST를 구현하기 위한 CI/CD 및 전략입니다.
무엇을 배울 것인가
- DAST 작동 방식 및 파이프라인에서 DAST를 사용하는 경우
- 자동 스캔을 위한 OWASP ZAP 구성
- DAST를 사용한 API 보안 테스트
- 퍼징 및 고급 테스트 기술
- CI/CD 파이프라인에 DAST 통합
- 결과 분류 및 우선순위 지정
DAST 작동 방식
DAST 도구는 웹 애플리케이션을 분석하기 위해 구조화된 프로세스를 따릅니다.
- 스파이더/크롤링: 도구는 모든 페이지, 양식 및 API 엔드포인트를 검색하는 애플리케이션을 탐색합니다.
- 패시브 스캔: 민감한 정보, 누락된 헤더, 안전하지 않은 쿠키를 찾는 HTTP 응답을 분석합니다.
- 능동 스캔: 악성 페이로드(SQL 인젝션, XSS 페이로드, 경로 탐색) 전송 및 응답 분석을 통해 취약점 파악
- 보고: 발견된 취약점을 심각도별로 분류하고 해결 지침을 포함하는 보고서를 생성합니다.
파이프라인에서 DAST를 사용해야 하는 경우
DAST에는 실행 중인 애플리케이션이 필요하므로 일반적으로 단계별로 배치됩니다. 파이프라인의 다음 단계:
- 스테이징 환경: 스테이징 배포 후, 프로덕션으로 승격 전
- 풀 리퀘스트: 각 PR에 대한 임시 환경(미리보기 배포)
- 야간 스캔: 스테이징 환경에서 매일 밤 전체 검사가 예약됩니다.
- 배포 후: 각 프로덕션 배포 후 라이트 스캔(수동 스캔만 해당)
DAST: 장점과 한계
장점: 낮은 오탐률, 실제 런타임 취약점 발견, 소스 코드에 대한 액세스가 필요하지 않으며 인프라 구성을 테스트합니다. 제한사항: SAST보다 느리고, 실행 중인 애플리케이션이 필요합니다. 모든 코드를 다루지는 않으며, 복잡한 비즈니스 로직에서 취약점을 찾지 못할 수도 있습니다.
OWASP ZAP: 오픈 소스 표준
OWASP ZAP(Zed 공격 프록시) 전 세계에서 가장 많이 사용되는 오픈 소스 DAST 도구, OWASP 재단에서 관리합니다. 무료이며 확장 가능하며 수동 사용을 모두 지원합니다. (CI/CD 파이프라인의 경우) 자동화된 것보다 (인터셉트 프록시로)
Docker의 ZAP 기준 스캔
자동화된 DAST 스캔을 실행하고 컨테이너를 사용하는 가장 쉬운 방법 공식 ZAP Docker:
# Baseline scan: scan veloce, solo passive checks
docker run --rm -t ghcr.io/zaproxy/zaproxy:stable \
zap-baseline.py \
-t https://staging.myapp.com \
-r zap-report.html \
-J zap-report.json \
-c zap-baseline.conf
# Full scan: scan completo con active scanning
docker run --rm -t ghcr.io/zaproxy/zaproxy:stable \
zap-full-scan.py \
-t https://staging.myapp.com \
-r zap-full-report.html \
-J zap-full-report.json
# API scan: specifico per API REST/GraphQL
docker run --rm -t ghcr.io/zaproxy/zaproxy:stable \
zap-api-scan.py \
-t https://staging.myapp.com/api/openapi.json \
-f openapi \
-r zap-api-report.html
CI/CD에 대한 ZAP 구성
ZAP의 동작을 사용자 정의하려면 다음과 같은 구성 파일을 사용합니다. 활성화할 규칙, 심각도 임계값 및 제외를 정의합니다.
# zap-baseline.conf
# Formato: ID_regola WARN|IGNORE|FAIL
# Regole passive scan
10010 WARN # Cookie No HttpOnly Flag
10011 WARN # Cookie Without Secure Flag
10015 FAIL # Incomplete or No Cache-control
10017 WARN # Cross-Domain JavaScript Source
10020 FAIL # X-Frame-Options Header
10021 FAIL # X-Content-Type-Options Header
10038 FAIL # Content Security Policy Header
10098 WARN # Cross-Domain Misconfiguration
10202 WARN # Absence of Anti-CSRF Tokens
90033 WARN # Loosely Scoped Cookie
GitHub Actions에 통합
# .github/workflows/dast.yml
name: DAST Security Scan
on:
deployment_status:
jobs:
dast:
if: github.event.deployment_status.state == 'success'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: OWASP ZAP Baseline Scan
uses: zaproxy/action-baseline@v0.12.0
with:
target: ${{ github.event.deployment_status.target_url }}
rules_file_name: "zap-baseline.conf"
cmd_options: "-a -j"
fail_action: true
- name: Upload ZAP Report
if: always()
uses: actions/upload-artifact@v4
with:
name: zap-report
path: report_html.html
API 보안 테스트
최신 API(REST, GraphQL, gRPC)에는 특정 DAST 접근 방식이 필요합니다. 취약점 API에서 가장 일반적인 것은 다음과 같습니다.
- 손상된 개체 수준 권한 부여(BOLA): ID를 변경하여 다른 사용자의 리소스에 접근
- 손상된 인증: 약한 JWT 토큰, 속도 제한 없음, 무효화되지 않은 세션
- 과도한 데이터 노출: 필요 이상으로 많은 데이터를 반환하는 API
- 대량 할당: 요청 본문을 통해 예상치 못한 필드 수정
- 주입: SQL 인젝션, NoSQL 인젝션, API 파라미터를 통한 명령어 인젝션
OpenAPI를 사용한 ZAP API 스캔
ZAP는 OpenAPI 사양을 지원하여 각 엔드포인트에 대한 테스트를 자동으로 생성합니다.
# .github/workflows/api-dast.yml
name: API DAST Scan
on:
workflow_dispatch:
schedule:
- cron: "0 2 * * 1-5" # Ogni notte lavorativa alle 2:00
jobs:
api-scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: ZAP API Scan
uses: zaproxy/action-api-scan@v0.7.0
with:
target: "https://staging-api.myapp.com/openapi.json"
format: openapi
fail_action: true
cmd_options: >
-z "-config replacer.full_list(0).description=AuthHeader
-config replacer.full_list(0).enabled=true
-config replacer.full_list(0).matchtype=REQ_HEADER
-config replacer.full_list(0).matchstr=Authorization
-config replacer.full_list(0).replacement=Bearer TEST_TOKEN"
퍼징: 무작위 입력을 사용한 테스트
Il 퍼징 무작위 또는 반무작위 입력을 애플리케이션에 보내는 기술 충돌, 메모리 누수 및 예상치 못한 동작을 발견합니다. DAST 맥락에서 퍼징은 특히 다음을 찾는 데 효과적입니다.
- 길이가 잘못된 필드의 버퍼 오버플로
- 잘못된 입력으로 인한 구문 분석 오류(손상된 JSON/XML/YAML)
- 요청이 경쟁하는 경쟁 조건
- 대용량 페이로드로 인한 서비스 거부
퍼징의 유형
- 돌연변이 기반: 유효한 입력 수정(문자 변경, 페이로드 추가)
- 세대 기반: 스키마를 기반으로 처음부터 입력을 생성합니다.
- 보장 안내: 적용 범위 피드백을 사용하여 보다 효과적인 입력 생성
Burp Suite: 전문 도구
버프 스위트 PortSwigger 및 침투에 가장 많이 사용되는 상용 DAST 도구 전문 테스터. 커뮤니티 버전은 무료이지만 제한되어 있습니다. 프로페셔널 버전 자동화된 스캐너, 고급 침입자 및 팀 협업 기능을 제공합니다.
Burp Suite는 테스터가 가로챌 수 있는 수동 및 반자동 분석에 탁월합니다. 요청을 수정하고 사용자 정의된 페이로드로 다시 시작하세요. CI/CD 통합의 경우 Burp Suite Enterprise는 예약된 스캔을 실행하기 위한 REST API를 제공합니다.
DAST 결과 관리
DAST 결과에는 위양성을 피하기 위해 구조화된 분류 프로세스가 필요합니다. 수정 사항의 우선순위를 지정합니다.
DAST 선별 프로세스
| 심각성 | 루게릭병 치료 | 행동 |
|---|---|---|
| 비판적인 | 24~48시간 | 배포 중지, 즉시 수정 |
| 높은 | 7일 | 배포 차단, 현재 스프린트에서 수정 예약 |
| 중간 | 30일 | 티켓 생성, 다음 스프린트 계획 |
| 낮음/정보 | 90일 | 백로그, 주기적인 평가 |
단일 페이지 애플리케이션용 DAST(SPA)
단일 페이지 애플리케이션(Angular, React, Vue)은 DAST에 대한 특정 과제를 제시합니다. 콘텐츠는 JavaScript를 통해 동적으로 생성되며 기존 크롤러는 모든 페이지를 탐색하지 마세요.
- ZAP의 AJAX 스파이더: 헤드리스 브라우저를 사용하여 SPA를 탐색하고 동적 콘텐츠를 검색하세요.
- 입증: JWT 기반 로그인 또는 SPA 세션을 처리하도록 ZAP 구성
- 사전 시딩: 애플리케이션 빌드에서 추출하여 테스트할 URL 목록을 ZAP에 제공합니다.
DAST 모범 사례
- 전용 환경: 프로덕션에서 직접 실행하지 않고 격리된 스테이징 환경에서 DAST를 실행합니다.
- 현실적인 테스트 데이터: 현실적인 데이터로 환경을 채워 커버리지 극대화
- 인증이 구성됨- 인증된 지역을 탐색하기 위한 테스트 자격 증명 구성
- 증분 스캔: PR 기준 스캔, 전체 야간 스캔
- SAST와의 상관관계: DAST 결과를 SAST 결과와 연관시켜 중복을 줄입니다.
- 빠른 피드백: 중요한 결과가 있으면 Slack/Teams를 통해 개발자에게 즉시 알립니다.
결론
DAST는 DevSecOps 전략에서 SAST를 보완하는 필수 요소입니다. SAST가 찾는 동안 소스 코드의 취약점을 확인하기 위해 DAST는 실행 중인 애플리케이션이 효과적으로 보안을 유지하고 구성, 헤더, 인증 및 비즈니스 흐름을 테스트합니다.
다음 기사에서는 살펴보겠습니다. SCA(소프트웨어 구성 분석), 오픈 소스 종속성을 분석하고 알려진 취약점을 발견하는 기술 프로젝트에서 사용하는 라이브러리.







