SSRF는 공격자가 악의적인 요청을 서버로 보내도록 유도하는 취약점입니다. 이를 통해 공격자는 서버가 외부 서비스나 내부 네트워크에 요청을 보낼 때 그 요청을 조작하거나, 공격자가 의도한 특정 리소스에 접근할 수 있게 만듭니다. 일반적으로 서버가 외부 API나 웹 서버에 요청을 보내는 기능을 악용하며, 이를 통해 내부 시스템을 스캔하거나 민감한 정보를 노출시킬 수 있습니다.
SSRF 공격 예시: 내부 시스템 정보 유출
웹 애플리케이션에서 사용자가 외부 URL을 입력하면 해당 URL로 데이터를 가져오는 기능을 제공하는 경우가 있습니다. 공격자는 이 기능을 악용하여 서버가 내부 시스템으로 요청을 보내도록 유도하고, 중요한 정보를 유출시킬 수 있습니다.
1. 공격 시나리오
- 공격자는 웹 애플리케이션에서 제공하는 URL 입력 필드에 악의적인 URL을 입력합니다. 예를 들어, http://127.0.0.1:5000/fetch_url?url=http://127.0.0.1/admin와 같은 URL을 사용합니다.
- 이 URL이 서버로 전송되면, 서버는 사용자가 제공한 **url=http://127.0.0.1/admin*을 기반으로 내부 시스템에 요청을 보냅니다.
- 만약 서버의 관리 페이지가 로컬 주소(http://127.0.0.1/admin)에 있다면, 서버는 이 주소로 내부 API 요청을 보내게 됩니다.
- 결과적으로 공격자는 서버를 통해 내부 관리 API나 시스템 관리 페이지에 접근할 수 있게 됩니다.
SSRF 공격 방어 방법
1URL 검증 및 화이트리스트
사용자 입력에 의한 악의적인 요청을 차단하려면, 서버는 사용자가 입력한 URL을 검증해야 합니다. 특히 내부 리소스(로컬 주소나 내부 네트워크 주소)로 향하는 요청을 차단하는 것이 중요합니다.
- 화이트리스트 사용:
- 서버가 요청할 수 있는 URL을 화이트리스트로 제한하여 외부에서 지정된 URL만 요청을 허용합니다.
- 예를 들어, http://127.0.0.1, http://localhost와 같은 로컬 주소는 요청을 차단합니다
SSRF 공격 예시: 파라미터 변조를 통한 내부 시스템 접근
웹 애플리케이션에서 사용자가 폼 데이터를 통해 내부 API로 전송되는 정보를 변조하는 파라미터 변조 공격은 SSRF공격의 일종입니다. 특히, & 구분자를 악용하여 파라미터 값을 변조하는 방식입니다.
공격 시나리오
공격자는 웹 애플리케이션에서 제공하는 폼 입력 필드에 악의적인 파라미터 변조 값을 삽입합니다. 예를 들어, 서버가 title과 user 파라미터를 받아서 내부 API로 전송하는 경우, 공격자는 title 필드에 &user=admin을 삽입하여 user 값을 변조할 수 있습니다.
예시:
- 공격자가 입력하는 값: 공격자는 title 필드에 title&user=admin을 입력합니다.
- title=title&user=admin body=body
- 서버가 변조된 데이터로 요청을 보낼 때: 서버는 사용자 입력을 title=title&user=admin로 받았기 때문에, 실제로 전송되는 데이터는 다음과 같습니다: title=title&user=admin$body=body&user=guest여기서 &user=admin을 공격자가 삽입하여 user 값을 admin으로 변조한 것입니다.
- 서버가 변조된 데이터 파싱: 서버는 파라미터를 순차적으로 처리하면서 user=admin을 첫 번째로 파싱하고, user=guest는 무시합니다. 이로 인해 user 값이 admin으로 설정됩니다.
- 결과적으로 반환되는 응답: 서버는 user가 guest여야 하지만, user 값이 admin으로 변조된 결과를 반환합니다.
- json 복사 { "title": "title", "body": "body", "user": "admin" }
SSRF 공격 방어 방법
- 파라미터 검증 및 이스케이프 처리
- 서버가 사용자 입력값을 그대로 사용하는 경우, &와 같은 특수 문자가 파라미터 값에 포함되지 않도록 검증하거나 이스케이프 처리해야 합니다.
- 파라미터 값 검증: title, body, user와 같은 입력 필드에서 특수 문자를 포함한 입력을 차단합니다.
'Dreamhack > 웹해킹' 카테고리의 다른 글
| [🌱Beginner] path traversal (0) | 2025.08.17 |
|---|---|
| (드림핵) blind-command (0) | 2025.04.02 |
| Command Injection (0) | 2025.04.01 |
| Blind Command Injection (0) | 2025.04.01 |
| (드림핵) Carve Party (0) | 2025.04.01 |