🌐 서버사이드 요청 위조 (SSRF) - 실습 시뮬레이터

CWE-918: Server-Side Request Forgery (SSRF)

✅ 학습 진행도
  • 진단 시작
  • SSRF 취약점 식별
  • Whitelist 검증 구현
✏️ Java 코드 에디터 취약한 코드
ImageProxy.java 💡 허용된 호스트(trusted.com)인지 확인하세요.
public void fetchImage(String userUrl) throws IOException {
    // [취약한 코드] 입력값을 그대로 URL 객체로 생성하여 요청
    // 공격자가 "http://localhost:8080/admin" 입력 시 내부망 접근 가능
    URL url = new URL(userUrl);
    InputStream in = url.openStream();
    // ... 이미지 처리 ...
}
💡 수정 가이드 (KISA 가이드)
1. 호스트 Whitelist 검증

URL 객체의 getHost() 메소드를 사용하여 허용된 도메인인지 확인합니다.

URL url = new URL(userUrl); if (!"trusted.com".equals(url.getHost())) { throw new SecurityException("Not allowed host"); } InputStream in = url.openStream();
📊 분석 결과 및 설명
🎯 목표

서버가 외부 리소스를 가져올 때, 내부 IP나 허용되지 않은 도메인으로의 요청을 차단하여 내부망 스캔 및 정보 유출을 방지해야 합니다.

⚠️ 현재 취약점

SSRF

공격자가 서버를 경유하여 내부 시스템에 접근하거나 클라우드 메타데이터를 탈취할 수 있습니다.

✅ 학습 진행도
  • 진단 시작
  • requests 취약점 식별
  • hostname 검증 적용
🐍 Python 코드 에디터 취약한 코드
crawler.py 💡 urlparse로 hostname을 추출하여 허용 목록과 비교하세요.
import requests

def fetch_site(url):
    # [취약한 코드] 입력받은 URL로 검증 없이 요청 전송
    # AWS 메타데이터(169.254.169.254) 등에 접근 가능
    response = requests.get(url)
    return response.content
💡 수정 가이드 (파이썬 가이드)
1. 도메인 Whitelist 검증

urlparse를 사용하여 hostname을 추출하고, 허용된 도메인 목록에 포함되는지 확인합니다.

from urllib.parse import urlparse parsed = urlparse(url) if parsed.hostname not in ['example.com', 'api.google.com']: raise ValueError("Forbidden host") response = requests.get(url)
📊 분석 결과 및 설명
🎯 목표

임의의 외부 리소스 접근을 차단하고, 정의된 안전한 도메인으로만 요청을 보내도록 제한해야 합니다.

⚠️ 현재 취약점

SSRF Vulnerability

입력 URL에 대한 통제가 없어 공격자가 서버를 악용하여 내부/외부 네트워크를 공격할 수 있습니다.