용어 사전

경로 탐색(Path Traversal)이란 — ../ 로 서버가 절대 내주면 안 되는 파일을 읽는 취약점

경로 탐색(디렉터리 탐색)은 파일명 입력에 ../를 섞어 의도한 폴더 밖의 .env나 설정 파일을 읽거나 쓰는 취약점입니다. 작동 원리와 기준 디렉터리 안으로 가두는 방어법을 설명합니다.

게시 2026-06-10 업데이트 2026-10-06 5분 읽기
이 페이지에서

경로 탐색은 파일명 입력란에 ../ 를 넣으면 서버 깊숙한 곳의 .env 를 읽을 수 있게 되는 취약점입니다. 동작 원리와 확실하게 막는 방법을 설명합니다(공격 절차 없음).

어디에 나타나는가

"사용자 입력이 파일을 고른다"는 곳이라면 어디든입니다.

기능위험한 사용
다운로드 / 미리보기?file= 을 파일명으로 직접 사용
이미지 / 첨부 표시URL 파라미터로 경로의 일부를 구성
업로드저장 경로에 사용자 제공 이름 사용 (쓰기 유형 — 가장 위험)
템플릿 / 로케일 로딩?lang= 등으로 파일을 동적으로 선택

왜 통하는가

../ 는 "상위 한 단계"를 의미합니다. 앱이 공개 폴더 + 사용자 입력을 이어 붙여 그 파일을 연다면, 쌓인 ../ 구간으로 공개 폴더 밖의 파일에 닿게 됩니다.

의도: /var/www/files/ + 사용자 입력
입력이 "상위로" 를 쌓음 (../ ../ ../ …)
↓ 앱이 정규화 없이 이어 붙인 뒤 open()
기준 밖에 닿음 (.env, 설정, 키, /etc) = 읽기/쓰기
기준 폴더에 사용자 입력을 이어 붙이면 쌓인 ../ 가 그 밖의 파일에 닿는다.

읽기는 정보 노출을 뜻하고, 쓰기(업로드)는 어디든 파일을 심을 수 있음을 뜻하며, 이는 RCE 로 이어질 수 있습니다.

방어: 입력을 경로로 쓰지 않기 + 기준으로 가두기

1

사용자 입력을 날것의 파일 경로로 절대 쓰지 않기 (가장 중요)

노출하는 파일은 ID → 실제 파일 허용 목록을 거쳐 해석하세요. 사용자는 식별자("3", "invoice")만 넘기고, 실제 경로는 서버가 결정합니다.

2

정규화한 뒤 기준 디렉터리 안에 머무는지 검증

언어의 리졸버(resolve/realpath)로 절대 경로로 바꾼 뒤, 그것이 허용된 기준 디렉터리로 시작하는지 검사하세요. 그 밖의 것은 모두 거부합니다. 단순한 '../' 문자열 제거는 인코딩 우회에 실패합니다.

3

앱을 최소 권한으로 실행

앱의 런타임 사용자가 읽을 수 있는 파일을 작업에 필요한 것으로 한정하세요. 누군가 빠져나가더라도 읽을 수 없는 파일은 아무것도 유출하지 않습니다.

4

비밀은 아예 공개 루트 밖에

.env, .git, 키, 백업을 애초에 웹 루트나 업로드 폴더에 두지 마세요. 배치만으로 공격받을 대상을 없앨 수 있습니다.

본 사이트의 견해: 배치 실수와 같은 종류의 문제이므로 올바른 순서로 고친다

경로 탐색은 .env 노출 사고와 같은 종류의 문제입니다. 둘 다 "웹으로 절대 닿으면 안 되는 것이 웹으로 닿게 된" 경우입니다. 임시 조치(헤더, 단순 필터)는 겉만 가릴 뿐, 코드와 배치가 고쳐지지 않으면 다른 경로로 여전히 유출됩니다. 순서는 (1) 입력을 경로로 쓰지 않는 코드, (2) 기준 디렉터리로 가두기, (3) 비밀을 공개 루트 밖에 두기 입니다. 근본 해결이 어떻게 이루어지는지는 공유 호스팅에서 안전한 배치를 함께 읽어 보세요.

비슷한 문제와의 차이

"비공개여야 할 파일을 밖에서 읽을 수 있다"는 결과는 같아 보여도, 원인에 따라 고칠 곳이 달라집니다.

문제원인고칠 곳
경로 탐색파일을 가리키는 입력이 허용된 위치를 빠져나갈 수 있다앱 코드(입력을 경로로 쓰지 않기)
로컬 파일 포함(LFI)입력이 프로그램이 불러와 실행하는 파일을 고른다앱 코드(불러올 수 있는 파일을 고정)
공개 디렉터리에 남은 파일.env나 .git이 웹에서 보이는 곳에 있다(→ 공개 디렉터리에 남은 비밀)파일 배치와 웹 서버 설정
IDOR파일 ID의 형식은 정상이지만 다른 사람의 파일을 가리킬 수 있다앱의 권한 확인

실제 사례: 웹 서버 자체의 결함

경로 탐색은 직접 만든 앱뿐 아니라 널리 쓰이는 제품에서도 발견됩니다.

  • Apache HTTP Server 2.4.49(2021): 경로 탐색 결함(CVE-2021-41773)이 있었고, Apache 프로젝트는 실제로 악용되고 있다고 밝혔습니다. 2.4.50에서 수정되었지만 수정이 불완전해(CVE-2021-42013) 2.4.51에서 다시 고쳐졌습니다. 설정에 따라 파일 읽기뿐 아니라 RCE로도 이어졌습니다.
  • WordPress 코어(2026): 페이지 템플릿을 결정하는 코드의 경로 탐색이 파일 포함 결함(CVE-2026-87902)으로 이어졌고, 특정 조건에서 RCE에 이를 수 있습니다(→ CVE-2026-87902 해설(영문)).

2024년 5월 미국 CISA와 FBI는 제조사에 이 부류의 결함을 없애라고 요청하는 경보를 냈습니다. 당시 CISA의 KEV(악용이 확인된 취약점 목록)에는 디렉터리 탐색 취약점이 55건 있었다고 합니다. 2025년 12월 공개된 MITRE의 "CWE Top 25"에서 경로 탐색(CWE-22)은 6위입니다.

내 사이트에서 확인하는 방법

1

입력을 받는 파일 처리를 찾는다

코드에서 파일을 열거나 보내는 함수(open, readFile, sendFile, include 등)나 경로를 만드는 함수(path.join 등)에 요청 값이 들어갈 수 있는 곳을 검색합니다.

2

확인 순서를 점검한다

입력이 쓰이는 곳에서 먼저 경로를 정규화(path.resolve나 realpath)한 뒤에 기준 디렉터리 안인지 확인하는지 봅니다. 정규화 전에 문자열만 검사한다면 순서를 고치세요.

3

웹 서버와 제품의 버전을 확인한다

Apache 2.4.49나 2.4.50처럼 경로 탐색이 알려진 버전을 쓰고 있지 않은지 확인합니다. CVE / KEV 조회로 사용 중인 제품의 알려진 취약점을 볼 수 있습니다.

4

보이면 안 되는 파일을 확인한다

사이트 점검으로 .env, .git, 데이터베이스 덤프를 밖에서 읽을 수 없는지 확인합니다. 읽을 수 있다면 경로 탐색과는 별개의 작업으로 배치를 고치세요.

출처(1차 자료)

  • CISA·FBI, "Secure by Design Alert: Eliminating Directory Traversal Vulnerabilities in Software"(2024년 5월 2일) — cisa.gov(KEV의 55건, 무작위 식별자 사용)
  • Apache HTTP Server, "Apache HTTP Server 2.4 vulnerabilities" — httpd.apache.org(CVE-2021-41773, CVE-2021-42013)
  • MITRE, "2025 CWE Top 25 Most Dangerous Software Weaknesses"(2025년 12월) — cwe.mitre.org(CWE-22가 6위)
  • OWASP, "Path Traversal" — owasp.org
  • IPA, "안전한 웹사이트 만드는 법"(일본어) — ipa.go.jp(검사되지 않은 경로 파라미터 / 디렉터리 트래버설)

다음으로 읽기

분류 번호

CWE는 취약점의 원인이 되는 약점의 종류를, MITRE ATT&CK는 공격자의 기법을 분류한 번호 체계입니다. 둘 다 MITRE가 관리하며 취약점 정보와 탐지 규칙 분류에 널리 쓰입니다.

CWE™: Copyright © 2006–2026, The MITRE Corporation. CWE is a trademark of The MITRE Corporation. The MITRE Corporation hereby grants you a non-exclusive, royalty-free license to use CWE for research, development, and commercial purposes. Any copy you make for such purposes is authorized on the condition that you reproduce MITRE’s copyright designation and this license in any such copy. CWE Terms of Use

FAQ

Q경로 탐색으로 무엇이 유출되나요?
A

앱이 노출할 의도가 전혀 없던 파일들입니다. .env(DB 자격 증명, API 키), 설정 파일, 개인 키, 소스 코드, /etc 같은 OS 경로 등입니다. 읽기를 넘어 업로드의 저장 경로에 닿으면 어디든 쓸 수 있어 RCE(원격 코드 실행)로 확대될 수 있습니다.

Q가장 효과적인 방어법은 무엇인가요?
A

사용자 입력을 날것의 파일 경로로 절대 쓰지 마세요. 꼭 써야 한다면 허용 목록(ID/파일명의 고정된 집합)을 거쳐 매핑하고, 라이브러리로 경로를 정규화한 뒤, 결과가 허용된 기준 디렉터리 안에 머무는지 검증하세요. 확장자 검사나 단순한 '../' 제거는 우회됩니다.

Q.htaccess 나 헤더로 막으면 되지 않나요?
A

그것은 다른 문제(민감한 파일이 웹 루트에 놓인 것)에 대한 임시 조치입니다. 근본 해결은 앱 본체, .env, .git 을 공개 루트 밖에 두고, 입력을 경로로 쓰지 않는 코드를 작성하는 것입니다. 임시 조치와 근본 해결은 별개의 작업입니다.

Q디렉터리 탐색(디렉터리 트래버설)과 경로 탐색은 같은 것인가요?
A

같습니다. 일본 IPA의 가이드는 디렉터리 트래버설, MITRE의 분류(CWE-22)는 Path Traversal이라고 부릅니다. 둘 다 파일을 가리키는 입력이 허용된 위치 밖의 파일에 닿는 것을 뜻합니다.

Q파일에 무작위 ID를 붙이면 막을 수 있나요?
A

효과적인 방법입니다. 미국 CISA와 FBI는 2024년 5월 경보에서 파일마다 무작위 식별자를 만들고, 원래 이름 같은 관련 정보는 따로 저장하라고 권장합니다. 그러면 사용자 입력이 경로의 일부가 되지 않으므로 이 부류의 결함이 생길 여지가 없습니다.

Q로컬 파일 포함(LFI)과는 무엇이 다른가요?
A

경로 탐색은 허용된 위치 밖의 파일을 읽거나 쓸 수 있다는 뜻입니다. LFI는 입력이 프로그램이 불러와 실행하는 파일을 고르는 것이고, 경로 탐색이 그 대상을 바깥 파일로 향하게 하는 데 자주 쓰입니다. LFI는 파일을 읽기만 하는 것이 아니라 코드로 실행하므로 RCE로 이어지기 쉽습니다.