서버 사이드 요청 위조

서버 사이드 요청 위조

설명

사용자 입력이 curl_init, curl_setopt, file_get_contents, fopen 같은 외부 요청 API의 URL로 사용되면 SSRF가 발생할 수 있습니다.

잠재적 영향

내부망 스캔, 클라우드 메타데이터 접근, 내부 서비스 권한 우회가 가능합니다.

해결 방법

URL은 고정된 허용 목록에서만 선택하고, 사설 IP 대역과 위험한 프로토콜을 차단합니다.

예시

변경 전

php
<?php
$url = $_GET['url'];
$body = file_get_contents($url);

변경 후

php
<?php
$allowed = ['status' => 'https://status.example.com/health'];
$target = $_GET['target'] ?? '';
if (!isset($allowed[$target])) {
    http_response_code(400);
    exit;
}

$context = stream_context_create(['http' => ['follow_location' => 0]]);
$body = file_get_contents($allowed[$target], false, $context);

설명:

  • 변경 전: 사용자가 제어하는 데이터가 외부 URL 또는 소켓 요청 API에 도달합니다.
  • 변경 후: 요청 값은 URL이 아니라 서버 측 허용 목록의 키로만 사용하고, 등록되지 않은 대상은 요청하지 않고 리디렉션도 따라가지 않습니다. DNS 해석 결과와 네트워크 송신 정책도 제한해 내부 주소로 연결되지 않도록 구성하세요.

참조