728x90
반응형

이번에는 서버 사이드 요청 위조 (SSRF, Server-Side Request Forgery) 공격에 대해 설명하고, 이를 예방하는 방법을 다뤄보겠습니다. SSRF는 서버가 사용자 제공 URL을 요청하는 방식으로 발생하는 취약점입니다. 공격자는 이를 악용하여 서버가 다른 서버나 서비스를 요청하게 만들어 내부 네트워크에 접근하거나 외부 시스템에 대한 정보를 탈취할 수 있습니다.

7. 서버 사이드 요청 위조 (SSRF, Server-Side Request Forgery) 공격

7.1. SSRF 개요

서버 사이드 요청 위조(SSRF) 공격은 공격자가 웹 애플리케이션 서버가 외부나 내부 서버에 HTTP 요청을 보낼 수 있는 취약점을 악용하여, 서버를 대신해 요청을 보내는 공격입니다. 이 공격의 주요 특징은 서버가 요청을 보내는 대상외부가 아닌 내부 네트워크서버 자체로 향할 수 있다는 점입니다.

서버는 클라이언트 요청을 처리하면서 외부 서버에 HTTP 요청을 보내는 경우가 많습니다. 예를 들어, 사용자가 입력한 URL을 서버에서 요청하여 결과를 가져오는 방식입니다. SSRF 공격은 공격자가 의도적으로 서버에게 내부 시스템이나 서버 외부의 특정 리소스를 요청하게 만들어 공격하는 것입니다.

7.2. SSRF 발생 원인

SSRF 취약점이 발생하는 주요 원인은 서버가 클라이언트의 입력을 그대로 신뢰하여 HTTP 요청을 보낼 때 발생합니다. 클라이언트가 제공한 URL이나 주소를 통해 외부 리소스를 요청하는 시스템에서 이 취약점이 자주 발견됩니다. 만약 입력 값에 대한 검증이나 제한이 없을 경우, 악의적인 사용자가 서버가 요청할 수 있는 IP 주소URL을 조작하여 공격할 수 있습니다.

7.3. SSRF 공격 예시

  1. 내부 네트워크 탐색
    • 공격자는 서버가 내부적으로 사설 IP에 접근할 수 있는 권한을 갖고 있다면, 서버가 요청을 보내는 기능을 통해 내부 시스템의 정보나 서비스를 확인할 수 있습니다.
    예를 들어, 서버가 사용자가 제공한 URL을 통해 내부 시스템의 리소스를 요청하는 경우, 공격자는 localhost 또는 사설 IP를 제공하여 내부 네트워크를 스캔할 수 있습니다.
http://localhost/admin  # 서버가 내부의 관리자 페이지를 요청하도록 유도
 
  1. 메타서버 및 AWS 서비스 악용
    • 클라우드 환경에서 서버가 메타데이터를 요청할 수 있다면, 공격자는 이를 통해 인스턴스 메타데이터보안 키를 탈취할 수 있습니다.
    예를 들어, AWS에서 실행되는 서버는 EC2 메타데이터 API에 접근할 수 있으며, 공격자는 이를 악용하여 인스턴스의 보안 자격 증명을 탈취할 수 있습니다.
http://169.254.169.254/latest/meta-data/iam/security-credentials/
  1. 서버 내부 서비스 이용
    • 공격자는 서버가 요청할 수 있는 서비스를 이용하여 내부 시스템에 대한 정보를 얻거나, 공개되지 않은 서비스에 접근할 수 있습니다.
    예를 들어, 공격자는 SSH 서비스데이터베이스 서비스와 같은 내부 서비스에 접근할 수 있습니다.

7.4. SSRF 공격의 영향

SSRF 공격이 성공하면, 공격자는 다음과 같은 피해를 입힐 수 있습니다:

  • 내부 시스템 노출: 공격자는 서버가 내부 시스템에 요청을 보내도록 유도하여, 내부 네트워크서비스기밀 정보에 접근할 수 있습니다.
  • 메타데이터 탈취: 클라우드 환경에서 서버가 메타데이터를 요청하도록 유도하여, 인스턴스 키API 키 등을 탈취할 수 있습니다.
  • 정보 유출: 공격자는 SSRF를 통해 서버가 접근할 수 있는 내부 시스템의 정보를 추출하거나, 민감한 서비스에 접근할 수 있습니다.
  • 서비스 거부 (DoS): 내부 시스템에 무차별적인 요청을 보내서 내부 서비스를 마비시킬 수 있습니다.
  • 스캔 및 탐색: 공격자는 내부 네트워크에서 포트 스캔을 수행하거나 서비스 탐색을 할 수 있습니다.

7.5. SSRF 대응 방안

SSRF 공격을 예방하기 위한 주요 대응 방안은 입력 값 검증, 출력값 필터링, 그리고 네트워크 접근 제어입니다. 아래는 SSRF 공격을 방어하기 위한 방법들입니다.

URL 필터링 및 화이트리스트 적용

  • URL 검증을 통해 사용자가 입력한 URL을 화이트리스트 방식으로 처리해야 합니다. 예를 들어, 허용된 도메인이나 IP 범위에 대해서만 요청을 보낼 수 있도록 제한할 수 있습니다.
  • 사용자가 입력한 URL이 내부 주소사설 IP로 요청되지 않도록 해야 합니다. localhost127.0.0.1, 169.254.x.x와 같은 주소는 요청을 거부해야 합니다.
// PHP 예시: 화이트리스트 검증
$allowed_domains = ['example.com', 'api.example.com'];
$url = $_GET['url'];

if (in_array(parse_url($url, PHP_URL_HOST), $allowed_domains)) {
    // 요청 처리
} else {
    // URL이 허용되지 않음
    die("허용되지 않은 도메인입니다.");
}
  1. HTTP 요청 헤더의 제한
    • HTTP 요청을 보낼 때, Host 헤더를 검사하여, 사용자가 내부 서비스로 요청을 보내지 않도록 할 수 있습니다.
    • Host 헤더를 검증하여 외부 요청만 허용하도록 설정합니다.

메타데이터 API 접근 제한

  • 클라우드 환경에서는 메타데이터 접근을 차단해야 합니다. 예를 들어, AWS에서는 메타데이터 API에 대한 접근을 로컬 네트워크 내에서만 허용할 수 있습니다.
  • 예를 들어, Docker와 같은 컨테이너화된 환경에서는 메타데이터 API 접근을 IP 필터링으로 제한할 수 있습니다.
# AWS의 경우, 메타데이터 API 접근을 차단하기 위해 보안 그룹에서 IP를 제한
  1. 서버의 네트워크 요청에 대한 접근 제어
    • 서버에서 내부 네트워크다른 서비스에 대한 요청을 차단하는 방식으로 SSRF 공격을 막을 수 있습니다. 예를 들어, 내부 네트워크에 대한 요청을 외부에서 보낼 수 없도록 방화벽이나 네트워크 정책을 설정합니다.
    • **VPC (Virtual Private Cloud)**와 같은 클라우드 네트워크 내에서 외부 네트워크와의 연결을 제한하여, 공격자가 외부에서 내부 네트워크로 접근하지 못하게 해야 합니다.
  2. 요청의 응답 처리 제한
    • 서버가 외부 요청의 응답을 그대로 처리하거나, 응답 데이터를 클라이언트에게 전달하지 않도록 설정합니다. 요청의 응답 데이터를 검증하고 필요한 경우 응답 크기를 제한하는 것도 유효한 방법입니다.
  3. 정기적인 보안 테스트 및 감사
    • SSRF 취약점을 예방하기 위해서는 정기적인 보안 스캔침투 테스트를 진행해야 합니다. 보안 도구를 사용하여 시스템의 URL 요청 취약점을 검사하고, 이를 통해 취약점을 사전에 발견하여 수정합니다.
  4. 로그 기록 및 모니터링
    • 서버에서 발생하는 모든 요청로그로 기록하고, 의심스러운 요청이 들어왔을 때 모니터링을 통해 빠르게 대응할 수 있도록 해야 합니다. 예를 들어, 요청이 내부 주소로 보내진 경우 이를 로그에 남기고 즉시 대응할 수 있습니다.

7.6. 결론

SSRF 공격은 서버가 사용자 요청을 처리하는 과정에서 발생할 수 있는 보안 취약점으로, 공격자가 내부 시스템이나 서비스에 접근하는 방식으로 악용됩니다. 이를 방어하기 위해서는 URL 화이트리스트네트워크 접근 제어, 메타데이터 API 접근 제한 등 여러 방어 방법을 적용해야 합니다. SSRF 취약점을 사전에 발견하고 예방하는 것이 보안의 핵심입니다.

728x90
반응형

+ Recent posts