애플리케이션 보안

OWASP Top 10

meellon 2026. 6. 29. 06:00

학습 목표

SSRF(Server-Side Request Forgery)가 서버가 공격자 지정 URL을 요청해 내부망·메타데이터에 닿게 하는 방식을 설명할 수 있다.

Security Misconfiguration의 대표 실패(디버그 노출·기본 계정·불필요 서비스)를 설명할 수 있다.

Vulnerable and Outdated Components에서 의존성·이미지 CVE 관리·패치 흐름을 설명할 수 있다.

OWASP Top 10 2021 전 항목이 시리즈 어디와 연결되는지 지도로 정리할 수 있다.

Part 3 운영 가능한 체크리스트 관점으로 SSRF·설정·컴포넌트를 점검할 수 있다.

문제 상황

  • URL 미리보기 API ?url=http://169.254.169.254/latest/meta-data/클라우드 IAM role 유출
    • 서버가 아무 URL이나 fetch
  • 웹훅 검증 POST { "callback": "http://127.0.0.1:6379/..." }Redis 명령 주입 시도
  • 프로덕션에 DEBUG=true — stack trace에 DB connection string
  • K8s Dashboard 공개 Ingress · 기본 admin/admin 그대로
  • log4j·openssl CVE 터졌는데 SBOM 없음 — 어디 쓰는지 모름
  • npm audit 47 critical — ignore만 쌓임

9~11편에서 Injection·XSS·CSRF·접근 제어를 봤다. Part 3 마무리 — 서버가 대신 요청·설정 실수·낡은 라이브러리.

본 글의 URL·페이로드는 방어·테스트 학습 목적이다. 허가 없는 내부망·메타데이터 접근은 불법이다.

1. Part 3에서 다룬 것

OWASP 2021 주제 본 시리즈
A01 Broken Access Control IDOR·권한 8·11편
A02 Cryptographic Failures TLS·해시 3·4편
A03 Injection SQLi·command 9편
A04 Insecure Design 위협 모델·fail secure 1·2편
A05 Security Misconfiguration 본편 §3  
A06 Vulnerable Components 본편 §4  
A07 Auth Failures 세션·JWT·OAuth 4~7편
A08 Integrity Failures CI·아티팩트 Supply Chain 편
A09 Logging Failures 감사·알림 로깅·감사 편
A10 SSRF 본편 §2  

  • 한 편에 한 클래스가 아님 — 겹침 정상 (misconfig가 SSRF 넓히기도)
  • ASVS·배포 체크리스트는 운영 보안 Part에서 재정리

2. SSRF

SSRF — 공격자가 서버에게 HTTP(S)·기타 프로토콜 요청을 대신 보내게 함 (OWASP A10:2021 · CWE-918).

Attacker  →  app (url param)  →  server fetch  →  internal / metadata
타깃
Cloud metadata 169.254.169.254 IAM credentials
Internal API http://10.0.0.5/admin
Localhost service Redis, Elasticsearch 무인증
File URL file:///etc/passwd (스택·스킴에 따라)
# 취약 — ssrf-vulnerable.py
import requests

def preview_url(user_url: str):
    return requests.get(user_url, timeout=5).text

공격 user_url:

http://169.254.169.254/latest/meta-data/iam/security-credentials/

방어

# 안전 — ssrf-safe.py
from urllib.parse import urlparse
import ipaddress
import socket

BLOCKED_NETS = [
    ipaddress.ip_network("127.0.0.0/8"),
    ipaddress.ip_network("10.0.0.0/8"),
    ipaddress.ip_network("172.16.0.0/12"),
    ipaddress.ip_network("192.168.0.0/16"),
    ipaddress.ip_network("169.254.0.0/16"),
]

def resolve_host(host: str) -> ipaddress.ip_address:
    return ipaddress.ip_address(socket.gethostbyname(host))

def preview_url(user_url: str):
    parsed = urlparse(user_url)
    if parsed.scheme not in ("http", "https"):
        raise ValueError("scheme not allowed")
    ip = resolve_host(parsed.hostname)
    if any(ip in net for net in BLOCKED_NETS):
        raise ValueError("target not allowed")
    return requests.get(user_url, timeout=5, allow_redirects=False).text
통제 설명
Allowlist 허용 도메인만 (미리보기·웹훅)
Block private/link-local RFC1918·169.254
Redirect 금지 open redirect → internal
DNS rebinding resolve 후 IP 재검·짧은 TTL 주의
Network policy 앱 Pod → egress deny 기본 (Platform)
IMDSv2 metadata 토큰 필수 (cloud)
  • 앞서 least privilege — SSRF 성공해도 role scope 최소화
  • URL fetch 기능 — 정말 필요한지 설계 단계에서 질문 (Insecure Design)

3. Security Misconfiguration

Security Misconfiguration — 안전한 기본값·하ardening·불필요 기능 미적용 (OWASP A05:2021 · CWE-16).

실패 방어
Debug in prod Django DEBUG=True env별 분리·배포 검 gate
Default credentials admin/admin, postgres/postgres 첫 기동 강제 변경
불필요 노출 Swagger /docs 공개 auth·IP restrict
Verbose error SQL in 500 page generic message + server log
Open bucket S3 public-read block public access
Weak TLS TLS 1.0, NULL cipher 3편 TLS 정책
과도 permission K8s cluster-admin SA RBAC·least privilege
# 취약 패턴 — code/misconfig-k8s-vulnerable.example
# Dashboard exposed, default secret unchanged
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: admin-dashboard
spec:
  rules:
    - host: dashboard.example.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: kubernetes-dashboard
                port:
                  number: 443
체크  
CIS Benchmark OS·K8s·DB
IaC scan checkov, tfsec (8_IaC)
Helm values prod vs dev 분리
Security headers HSTS, CSP (10편)
불필요 포트 netstat / security group 최소
  • misconfiguration은 자동화로 잡는 비율이 큼 — CI·주기 스캔
  • 앞서 fail secure — 설정 파싱 실패 시 안전 default

4. Vulnerable and Outdated Components

Vulnerable Components — 알려진 CVE가 있는 라이브러리·OS·이미지 (OWASP A06:2021 · CWE-1104).

Dependency graph  →  CVE feed  →  scan (CI/registry)  →  patch / pin / virtual patch
계층 도구 예
App deps npm audit, pip-audit, OWASP Dependency-Check
Container Trivy, Grype, ECR scan
Runtime OS patch, base image 재빌드
Inventory SBOM CycloneDX/SPDX — Supply Chain
# dependency-scan.example
npm audit --audit-level=high
pip-audit -r requirements.txt
trivy image myapp:1.2.3 --severity HIGH,CRITICAL
정책  
Pin version ^ 남발 금지 — lockfile CI
SLA Critical N일 내 패치
EOL Node 16·Ubuntu 18.04 퇴역
WAF virtual patch 임시 — upgrade가 본질
Renovate/Dependabot PR + test
  • Transitive dependency — lockfile만 믿지 말고 SBOM diff
  • Supply chain — 서명·provenance는 Supply Chain 편에서 확장

5. 나머지 항목 한 줄

항목 핵심 시리즈
Cryptographic Failures 약한 알고·TLS off·평문 3·4편
Insecure Design 위협 모델 없이 기능 추가 1·2편
Auth Failures weak session·JWT in localStorage 4~7편
Integrity Failures unsigned plugin·CI tamper Supply Chain 편
Logging Failures 침해 미탐지 로깅·감사 편
  • Top 10은 순위표이지 체크리스트 전체가 아님 — ASVS·운영 보안 체크리스트와 병행

6. Part 3 체크리스트

영역 점검
Injection parameterized · no shell
XSS/CSRF encode · CSP · SameSite · token
Access control IDOR test · deny default
SSRF allowlist · block RFC1918 · no redirect
Misconfig debug off · no default cred · headers
Components audit in CI · patch SLA · SBOM

7. 정리

  • SSRF — 서버 출구가 공격면 — allowlist·private block·egress policy
  • Misconfiguration — prod hardening·자동 스캔·기본값 거부
  • Vulnerable componentsinventory + scan + patch — WAF는 임시
  • OWASP Top 10 전체는 시리즈 여러 편에 분산

다음에 다룰 것

  • 시크릿 관리
  • env, Vault, K8s Secret

해당 내용은 OWASP Top 10 2021, OWASP Server-Side Request Forgery Prevention Cheat Sheet, CWE-918 (Server-Side Request Forgery), CWE-16 (Configuration), CWE-1104 (Use of Unmaintained Third Party Components) 의 내용을 기반으로 합니다.

'애플리케이션 보안' 카테고리의 다른 글

API 보안  (0) 2026.07.01
시크릿 관리  (0) 2026.06.30
Broken Access Control  (0) 2026.06.28
XSS와 CSRF  (0) 2026.06.27
Injection  (0) 2026.06.26