경로 탐색 (Path Traversal)
GitLab v19.5요약
많은 파일 작업은 제한된 디렉터리 안에서 수행되도록 설계됩니다. 많은 프로그래밍 언어에서 null 바이트(0 또는 NULL)를 주입하면 공격자가 생성된 파일명을 잘라내어 공격 범위를 넓힐 수 있습니다. 이 검사는 요청의 파라미터(경로, 쿼리 문자열, 헤더, JSON, XML 등)를 수정하여 제한된 파일과 웹 루트 외부의 파일에 접근을 시도합니다.
설명#
많은 파일 작업은 제한된 디렉터리 안에서 수행되도록 설계됩니다. 공격자는 .. 나 / 구분자와 같은 특수 요소를 사용하여 제한된 위치를 벗어나 시스템의 다른 곳에 있는 파일이나 디렉터리에 접근할 수 있습니다. 가장 흔한 특수 요소 중 하나는 ../ 시퀀스이며, 대부분의 현대 운영 체제에서 현재 위치의 상위 디렉터리로 해석됩니다. 이를 상대 경로 탐색이라고 합니다. 경로 탐색에는 /usr/local/bin과 같은 절대 경로명의 사용도 포함되며, 이 역시 예상치 못한 파일에 접근하는 데 이용될 수 있습니다. 이를 절대 경로 탐색이라고 합니다.
많은 프로그래밍 언어에서 null 바이트(0 또는 NULL)를 주입하면 공격자가 생성된 파일명을 잘라내어 공격 범위를 넓힐 수 있습니다. 예를 들어 소프트웨어가 모든 경로명에 .txt를 덧붙여 공격자를 텍스트 파일로 제한하더라도, null 주입으로 이 제한을 사실상 무력화할 수 있습니다.
이 검사는 요청의 파라미터(경로, 쿼리 문자열, 헤더, JSON, XML 등)를 수정하여 제한된 파일과 웹 루트 외부의 파일에 접근을 시도합니다. 이후 로그와 응답을 분석하여 파일에 실제로 접근했는지 탐지합니다.
해결 방법#
경로 탐색 공격 기법을 사용하면 공격자가 웹 문서 루트 디렉터리 외부에 있을 수 있는 파일, 디렉터리, 명령에 접근할 수 있습니다. 공격자는 웹 서버의 임의 파일 내용을 실행하거나 노출하도록 URL을 조작할 수 있습니다. HTTP 기반 인터페이스를 노출하는 모든 장치는 경로 탐색에 취약할 수 있습니다.
대부분의 웹 사이트는 사용자 접근을 파일 시스템의 특정 영역, 일반적으로 "웹 문서 루트" 또는 "CGI 루트" 디렉터리로 제한합니다. 이러한 디렉터리에는 사용자 접근을 위한 파일과 웹 애플리케이션 기능을 구동하는 데 필요한 실행 파일이 들어 있습니다. 경로 탐색 공격은 파일 시스템의 어느 위치에서든 파일에 접근하거나 명령을 실행하기 위해 특수 문자 시퀀스의 동작을 활용합니다.
가장 기본적인 경로 탐색 공격은 ../ 특수 문자 시퀀스를 사용하여 URL에서 요청되는 리소스 위치를 변경합니다. 널리 쓰이는 대부분의 웹 서버는 이 기법으로 웹 문서 루트를 벗어나는 것을 막지만, ../ 시퀀스의 대체 인코딩은 보안 필터를 우회하는 데 쓰일 수 있습니다. 이러한 변형에는 슬래시 문자의 유효하거나 유효하지 않은 유니코드 인코딩(..%u2216 또는 ..%c0%af), Windows 기반 서버의 백슬래시 문자(..), URL 인코딩된 문자(%2e%2e%2f), 백슬래시 문자의 이중 URL 인코딩(..%255c) 등이 있습니다.
웹 서버가 URL 경로에서 경로 탐색 시도를 적절히 차단하더라도, 웹 애플리케이션 자체가 사용자 입력을 부적절하게 처리하여 여전히 취약할 수 있습니다. 이는 템플릿 메커니즘을 사용하거나 파일에서 정적 텍스트를 읽어 오는 웹 애플리케이션에서 흔히 발생하는 문제입니다. 이 공격의 변형에서는 원래 URL 파라미터 값이 웹 애플리케이션의 동적 스크립트 파일명으로 대체됩니다. 그 결과 해당 파일이 실행 가능한 스크립트가 아니라 텍스트로 해석되어 소스 코드가 노출될 수 있습니다. 이러한 기법은 현재 작업 디렉터리의 목록을 드러내기 위한 점(.)이나, 기초적인 파일 확장자 검사를 우회하기 위한 %00 NULL 문자와 같은 추가 특수 문자를 함께 사용하는 경우가 많습니다.