서버사이드 요청 위조 (SSRF)

Server-Side Request Forgery (SSRF)

설명

SSRF는 서버가 외부로 나가는 HTTP 요청의 대상(URL/host)을 사용자 입력으로부터 직접 받아 구성할 때 발생합니다. 공격자는 이 입력을 조작해 서버가 내부망(127.0.0.1, 10.x.x.x 등)이나 보호된 서비스(예: 클라우드 메타데이터 엔드포인트)로 요청을 보내게 만들 수 있습니다. 이를 통해 내부 자원 탐색, 민감 정보 획득, 권한 우회 등의 공격이 가능합니다. 또한 리다이렉트, DNS rebinding, open redirect 등을 이용해 검증을 우회하기도 합니다.

잠재적 영향

  • 내부망 우회 접근: 서버가 대신 내부 IP/호스트로 접속하여 방화벽 안쪽 자원에 접근할 수 있습니다.

  • 민감 정보 유출: DB 관리 콘솔, 내부 API, 클라우드 메타데이터(예: 169.254.169.254) 등에서 토큰/크리덴셜이 노출될 수 있습니다.

  • 인증 우회 및 권한 상승: 내부 전용 관리 엔드포인트를 호출하여 인증을 우회하거나 더 높은 권한을 얻을 수 있습니다.

  • 서비스 장애(DoS): 대량의 외부/내부 요청을 유발해 자원을 고갈시키거나 백엔드 서비스에 과부하를 줄 수 있습니다.

  • 공격 인프라로 악용: 내부망 스캐닝, 포트 스캔의 중계 지점으로 서버가 악용될 수 있습니다.

해결 방법

  • Host allow-list: URL의 host는 고정 값 또는 사전 정의된 allow-list에서만 선택합니다. 가능한 경우 식별자(ID) → 고정 URL 매핑을 사용합니다.

  • Path 검증/정규화: 경로는 화이트리스트 기반으로 제한하고, '..' 등 디렉터리 이동을 금지하며, URL을 표준 파서(new URL 등)로 정규화 후 사용합니다.

  • 내부 자원 차단: 사설 IP 대역(127.0.0.0/8, 10.0.0.0/8, 169.254.0.0/16, 172.16.0.0/12, 192.168.0.0/16 등), localhost, 메타데이터 엔드포인트로의 접근을 차단합니다.

  • 프로토콜 제한: http/https만 허용하고 file://, ftp://, gopher:// 등은 금지합니다.

  • 리다이렉트 제어: 자동 리다이렉트를 비활성화하거나, 리다이렉트 목적지도 동일한 검증(allow-list, 내부 IP 차단)을 재적용합니다.

취약한 코드 및 안전한 코드 예시

취약한 코드

안전한 코드

설명:

  • 취약한 코드: 사용자 입력 URL을 그대로 http/https 요청에 사용하여, 공격자가 내부 IP(127.0.0.1, 169.254.169.254 등)나 사설 서비스로 서버를 대신 접근시키는 SSRF가 가능합니다. 또한 리다이렉트를 허용하면 외부 → 내부로 우회될 수 있습니다.

  • 안전한 코드: - host는 사전 정의된 식별자(allow-list)로만 선택하고, path는 화이트리스트 정규식으로 제한해 '..' 등의 경로 이동을 차단했습니다.

  • URL 표준 파서를 사용해 안전하게 조합했고, maxRedirects: 0으로 리다이렉트 우회를 방지했습니다.

  • 이 방식은 사용자가 임의의 host/IP를 주입할 수 없게 하여 SSRF 공격 면을 근본적으로 축소합니다.

참조

Last updated