웹 애플리케이션은 외부 URL에서 데이터를 가져오거나 API를 호출하는 기능을 자주 사용합니다. 이러한 기능이 적절하게 검증되지 않을 경우 SSRF(Server-Side Request Forgery, 서버사이드 요청 위조) 취약점이 발생할 수 있습니다. 이번 글에서는 SSRF 취약점의 개념과 공격 방식, 실제 공격 사례, 그리고 대응 방안을 살펴보겠습니다.
🧐 SSRF(Server-Side Request Forgery) 취약점이란?
SSRF는 서버가 URL이나 외부 리소스에 요청을 보내는 기능을 악용해, 공격자가 조작한 대상에 서버가 요청을 보내도록 만드는 취약점입니다. 이를 통해 공격자는 직접 접근할 수 없는 내부 시스템, 클라우드 메타데이터 서비스, 신뢰된 백엔드 API 등에 우회적으로 접근을 시도할 수 있습니다.
이 취약점이 위험한 이유는 서버가 보유한 네트워크 및 내부 자원 접근 권한을 가지고 이를 이용해 외부에서는 접근할 수 없는 내부 시스템에 접근하거나, 클라우드 환경의 메타데이터 서비스와 같은 민감한 정보에 접근할 수 있기 때문입니다.
⚠️ SSRF 공격은 어떻게 동작할까? (*공격 시나리오)
SSRF 공격은 일반적으로 사용자 입력값이 외부 요청 기능에 그대로 전달될 때 발생합니다. 공격자는 URL 파라미터나 API 요청 값을 조작해 서버가 공격자가 원하는 대상에 요청을 보내도록 만듭니다.
다음과 같은 PHP 코드가 있다고 가정해보겠습니다.
| <?php $url = $_GET[‘url’]; // 사용자 입력값$response = file_get_contents($url);echo $response; ?> |
이 코드는 사용자가 전달한 URL을 그대로 받아 해당 URL의 내용을 서버에서 가져와 사용자에게 반환합니다. 문제는 입력값에 대한 검증이 전혀 이루어지지 않는다는 점입니다. 공격자는 이 기능을 악용해 서버가 내부 시스템에 요청을 보내도록 만들 수 있습니다.
서버는 전달된 URL에 요청을 보내고 결과를 반환합니다.
| https://example.com/fetch.php?url=https://example.org/data.json |
하지만 공격자는 URL 파라미터를 조작해 서버가 내부 시스템에 접근하도록 유도할 수 있습니다. 공격 요청 예시는 다음과 같습니다.
| https://example.com/fetch.php?url=http://127.0.0.1/admin |
이 경우 서버는 내부 네트워크에 있는 127.0.0.1 주소로 요청을 보내게 되며, 애플리케이션 구현 방식에 따라 내부 관리자 페이지의 응답이 반환되거나, 서버 내부에서만 요청이 수행 될 수 있습니다.
또 다른 예로, 클라우드 환경에서는 SSRF를 이용해 메타데이터 서비스에 접근하는 공격이 발생하기도 합니다. 공격 요청 예시는 다음과 같습니다.
| https://example.com/fetch.php?url=http://169.254.169.254/latest/meta-data/ |
이 주소는 일부 클라우드 환경에서 인스턴스 메타데이터를 제공하는 내부 서비스로, 접근에 성공할 경우 엑세스 토큰, 인스턴스 관련 메타데이터 등 민감한 정보가 노출될 위험이 있습니다.
‼️실제 환경에서는? 단순한 내부 IP 주소뿐 아니라 우회된 주소 표기, 리다이렉션, DNS 해석 등을 통해 SSRF가 발생할 수 있습니다.
🛡️SSRF 취약점 대응 방안은?
SSRF 취약점을 예방하려면 사용자 입력에 대한 검증뿐 아니라, 서버가 최종적으로 접근할 수 있는 요청 대상을 애플리케이션과 네트워크 수준에서 함께 통제해야 합니다.
✅ 사용자 입력으로 전달되는 URL에 대해 허용된 대상에 한해서 요청할 수 있도록 제한
✅ 요청 가능한 스키마, 호스트, 포트 범위를 제한
✅ 내부망, 루프백, 메타데이터 서비스 등 내부자원으로 연결되는 주소에 대한 접근 차단
✅ 리다이렉션이 발생하는 경우 최종 목적자를 검증
✅ 서버 요청 대상의 도메인 해석 결과 및 실제 연결 IP를 함께 검증
✅ 서버의 아웃바운드 요청은 업무상 필요한 목적지로만 제한
✅ 클라우드 환경에서 메타데이터 서비스 접근 제한
✅ 스패로우의 애플리케이션 보안 테스트 도구를 활용한 SSRF 취약점 점검무엇보다도 개발 단계에서 취약한 코드 패턴을 사전에 발견하고, 운영 환경에서도 지속적으로 취약점을 점검하는 것이 중요합니다. 스패로우의 소스코드 보안약점 분석 도구인 Sprrow SAST는 소스코드를 분석하여 사용자 입력이 외부 요청 함수로 전달되는 코드 흐름과 검증이 누락된 요청 처리 패턴을 식별함으로써, SSRF로 악용될 수 있는 취약 코드 구조를 개발 단계에서 점검하는 데 도움을 줄 수 있습니다. 웹 애플리케이션 취약점 동적 분석 도구인 Sparrow DAST를 활용하면 실행 중인 웹 애플리케이션에 다양한 요청값을 적용해 서버가 의도하지 않은 대상에 요청을 발생 시키는지 점검함으로써, SSRF 취약점을 탐지할 수 있습니다. Sparrow SAST와 Sparrow DAST를 함께 활용하면 개발 단계와 운영 환경에서 SSRF 취약점을 지속적으로 점검하고 대응할 수 있습니다. |
SSRF는 서버가 공격자가 조작한 입력을 통해 서버가 의도하지 않은 대상에 요청을 보내도록 만드는 취약점으로, 내부 네트워크 및 자원 접근 권한이 악용될 경우 내부 시스템 접근, 민감 정보 유출 등 심각한 보안 문제로 이어질 수 있습니다. 특히 클라우드 환경과 마이크로서비스 구조에서는 SSRF 공격의 영향 범위가 더욱 확대될 수 있습니다.
따라서 서버가 외부 리소스에 접근하는 기능을 구현할 때는 사용자 입력 검증 뿐 아니라 요청 가능한 대상의 범위를 제한하고, 네트워크 차원에서 내부 자원 접근을 통제해야 합니다. 또한, 개발 단계와 운영 단계에서 보안 테스트 도구를 활용한 보안 점검을 지속적으로 수행해 취약점을 사전에 발견하고 대응하는 것이 중요합니다.
[참고문헌]
1. CWE-918: Server-Side Request Forgery (SSRF) / CWE / https://cwe.mitre.org/data/definitions/918.html
