학습 목표
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
- 서버가 아무 URL이나
- 웹훅 검증
POST { "callback": "http://127.0.0.1:6379/..." }— Redis 명령 주입 시도 - 프로덕션에
DEBUG=true— stack trace에 DB connection string - K8s Dashboard 공개 Ingress · 기본 admin/admin 그대로
log4j·opensslCVE 터졌는데 SBOM 없음 — 어디 쓰는지 모름npm audit47 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 components — inventory + 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) 의 내용을 기반으로 합니다.