경로 탐색은 파일명 입력란에 ../ 를 넣으면 서버 깊숙한 곳의 .env 를 읽을 수 있게 되는 취약점입니다. 동작 원리와 확실하게 막는 방법을 설명합니다(공격 절차 없음).
어디에 나타나는가
"사용자 입력이 파일을 고른다"는 곳이라면 어디든입니다.
| 기능 | 위험한 사용 |
|---|---|
| 다운로드 / 미리보기 | ?file= 을 파일명으로 직접 사용 |
| 이미지 / 첨부 표시 | URL 파라미터로 경로의 일부를 구성 |
| 업로드 | 저장 경로에 사용자 제공 이름 사용 (쓰기 유형 — 가장 위험) |
| 템플릿 / 로케일 로딩 | ?lang= 등으로 파일을 동적으로 선택 |
왜 통하는가
../ 는 "상위 한 단계"를 의미합니다. 앱이 공개 폴더 + 사용자 입력을 이어 붙여 그 파일을 연다면, 쌓인 ../ 구간으로 공개 폴더 밖의 파일에 닿게 됩니다.
읽기는 정보 노출을 뜻하고, 쓰기(업로드)는 어디든 파일을 심을 수 있음을 뜻하며, 이는 RCE 로 이어질 수 있습니다.
방어: 입력을 경로로 쓰지 않기 + 기준으로 가두기
사용자 입력을 날것의 파일 경로로 절대 쓰지 않기 (가장 중요)
노출하는 파일은 ID → 실제 파일 허용 목록을 거쳐 해석하세요. 사용자는 식별자("3", "invoice")만 넘기고, 실제 경로는 서버가 결정합니다.
정규화한 뒤 기준 디렉터리 안에 머무는지 검증
언어의 리졸버(resolve/realpath)로 절대 경로로 바꾼 뒤, 그것이 허용된 기준 디렉터리로 시작하는지 검사하세요. 그 밖의 것은 모두 거부합니다. 단순한 '../' 문자열 제거는 인코딩 우회에 실패합니다.
앱을 최소 권한으로 실행
앱의 런타임 사용자가 읽을 수 있는 파일을 작업에 필요한 것으로 한정하세요. 누군가 빠져나가더라도 읽을 수 없는 파일은 아무것도 유출하지 않습니다.
비밀은 아예 공개 루트 밖에
.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위입니다.
내 사이트에서 확인하는 방법
입력을 받는 파일 처리를 찾는다
코드에서 파일을 열거나 보내는 함수(open, readFile, sendFile, include 등)나 경로를 만드는 함수(path.join 등)에 요청 값이 들어갈 수 있는 곳을 검색합니다.
확인 순서를 점검한다
입력이 쓰이는 곳에서 먼저 경로를 정규화(path.resolve나 realpath)한 뒤에 기준 디렉터리 안인지 확인하는지 봅니다. 정규화 전에 문자열만 검사한다면 순서를 고치세요.
웹 서버와 제품의 버전을 확인한다
Apache 2.4.49나 2.4.50처럼 경로 탐색이 알려진 버전을 쓰고 있지 않은지 확인합니다. CVE / KEV 조회로 사용 중인 제품의 알려진 취약점을 볼 수 있습니다.
보이면 안 되는 파일을 확인한다
사이트 점검으로 .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(검사되지 않은 경로 파라미터 / 디렉터리 트래버설)
다음으로 읽기
- 사고 사례: .env 파일 전체 노출
- 방어: 공유 호스팅에서 .env 보호하기 · 용어집: RCE란