본문 바로가기

old/Cyber Security

사이버 보안: SSRF 란

반응형

정의

SSRF(Server Side Request Forgery)는 서버 측 요청 위조를 의미하는 웹 보안 취약점입니다. 이 취약점은 공격자가 목표 서버로부터 다른 내부 또는 외부 리소스로 요청을 보낼 수 있게 해주는 것을 의미합니다. SSRF를 통해 공격자는 서버의 제한이나 보안 조치를 우회하여 악의적인 요청을 보낼 수 있습니다.

하지만 실무에서는 SSRF 취약점이 발생할 수 있는 위험한 상황이 많지 않습니다. URL을 파라미터로 전달받는 경우가 거의 없기 떄문입니다.

취약점 발생 지점 리스트

SSRF 취약점은 주로 입력 유효성 검사가 부족하거나, 신뢰할 수 없는 사용자 입력을 처리하는 기능에서 발생합니다. 서버가 외부 리소스에 액세스해야 하는 기능을 갖춘 웹 애플리케이션에서 특히 취약성이 높습니다.

  • 내부 네트워크의 시스템 또는 서비스에 액세스해야 하는 경우
  • 인증이 필요한 서비스에 대한 우회 접근이 필요한 경우
  • 웹 애플리케이션의 취약한 구성을 악용하여 시스템에 대한 정보 수집이나 공격적인 동작을 수행해야 하는 경우
  • HTTP요청: 파라미터로 URL을 받는 경우.
  • api: 날씨 정보를 출력해주는 기능.
  • 사용자 입력을 통해 원격 URL을 받고 이를 서버에서 처리하는 경우
  • 서버 측에서 URL을 동적으로 생성하여 외부 리소스에 요청을 보내는 경우

취약 지점 예제

import requests

def process_image(url):
    response = requests.get(url)
    # 이미지 처리 로직

# 사용자 입력을 처리하는 부분
user_input = input("이미지 URL을 입력하세요: ")
process_image(user_input)

위의 예제에서는 사용자가 입력한 이미지 URL을 process_image() 함수로 전달합니다. 그러나 사용자는 임의의 URL을 입력할 수 있으며, 이를 통해 SSRF 취약점이 발생할 수 있습니다. 사용자가 악의적으로 내부 시스템의 URL을 입력하면, 서버는 해당 URL로 요청을 보내게 됩니다.

공격 순서

  1. 공격자는 악의적인 요청을 서버로 전송하고, 이를 통해 URL을 조작합니다.
  2. 서버는 조작된 요청을 받아서 외부 서비스에 전송합니다.
  3. 외부 서비스는 요청을 처리하고 응답을 반환합니다.
  4. 서버는 외부 서비스의 응답을 받아 공격자에게 반환합니다.

공격 구조

공격 예제

SSRF 공격기법 리스트

대응방법

파라미터를 URL로 보내지 않는다면 이는 근본적인 대응방법이 될수 있습니다.

하지만 반드시 사용해야 한다면 아래와 같은 대응방법이 있습니다.

  1. 입력 유효성 검사: 사용자가 입력한 URL을 신뢰할 수 있는지 확인하기 위해 적절한 입력 유효성 검사를 수행해야 합니다. 허용되는 도메인 또는 IP 주소의 목록을 만들어 사용자 입력을 필터링하거나, URL을 파싱하여 유효성을 검증해야 합니다.
  2. 화이트리스트 필터링: 서버가 접근할 수 있는 리소스를 제한하기 위해 화이트리스트 필터링을 구현해야 합니다. 내부 시스템에 대한 액세스를 허용할 필요가 없는 경우, 외부 리소스로의 요청만 허용하는 것이 좋습니다.
  3. 보안 구성 및 네트워크 격리: 서버와 내부 시스템 간의 네트워크 격리를 구성하여 외부로부터의 액세스를 제한해야 합니다. 내부 시스템에 대한 접근을 필요한 경우에도, 외부로의 접근을 제한하고 필요한 경우 안전한 프록시 서버를 통해 간접적으로 액세스해야 합니다.
  4. 업데이트 및 보안 패치: 사용 중인 소프트웨어와 라이브러리를 최신 버전으로 유지하고 보안 패치를 적용해야 합니다. SSRF와 관련된 취약점에 대한 업데이트 및 패치가 제공되면, 즉시 적용해야 합니다.
반응형