Network

[웹 보안] 디렉터리 트래버설(Directory Traversal) 공격이란?

ioh'sDeveloper 2025. 1. 30. 20:58

디렉터리 트래버설(Directory Traversal) 공격이란?

웹 애플리케이션을 개발할 때, 파일을 다루는 기능은 필수적입니다. 하지만, 사용자의 입력을 검증 없이 파일 경로로 사용할 경우 디렉터리 트래버설(Directory Traversal) 공격에 노출될 수 있습니다. 이번 글에서는 디렉터리 트래버설이 무엇인지, 공격 방식과 실제 예제, 그리고 이를 방어하는 방법을 정리해보겠습니다.


🔍 디렉터리 트래버설(Directory Traversal) 개념

**디렉터리 트래버설(Directory Traversal, 패스 트래버설)**은 공격자가 파일 시스템을 탐색하여 허가되지 않은 파일에 접근하는 보안 취약점입니다. 웹 애플리케이션이 사용자 입력을 기반으로 파일을 읽거나 로드하는 경우, 공격자는 ../ 같은 디렉터리 이동 문자를 활용해 시스템의 중요한 파일을 열어볼 수 있습니다.


⚠️ 디렉터리 트래버설 공격 방식

📌 취약한 코드 예제 (Java)

import java.io.*;
import javax.servlet.http.*;

public class FileReaderServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
        String fileName = request.getParameter("file"); // 사용자가 파일명을 입력

        File file = new File("/var/www/uploads/" + fileName); // 입력값을 그대로 경로에 사용
        BufferedReader reader = new BufferedReader(new FileReader(file));

        String line;
        while ((line = reader.readLine()) != null) {
            response.getWriter().println(line);
        }
        reader.close();
    }
}

위 코드에서는 fileName을 사용자 입력값 그대로 받아 파일을 읽어오고 있습니다. 만약 공격자가 다음과 같은 요청을 보낸다면 어떻게 될까요?

http://example.com/readfile?file=../../etc/passwd

이 경우, fileName이 ../../etc/passwd로 설정되면서, /var/www/uploads/../../etc/passwd 경로를 참조하게 됩니다. 결국, 시스템의 중요한 파일인 /etc/passwd를 열어볼 수 있습니다.

🚨 공격자의 의도

  • /etc/passwd, /etc/shadow 등 민감한 시스템 파일을 읽기
  • 소스 코드 파일 열람 (.env, config.php 등)
  • ../를 사용해 디렉터리를 이동하여 기밀 데이터 접근

🛡 디렉터리 트래버설 공격 방어 방법

✅ 1. 사용자 입력값 검증

입력값이 ../를 포함하는지 체크하여 공격을 차단해야 합니다.

if (fileName.contains("..")) {
    throw new SecurityException("잘못된 파일 경로 접근 시도");
}

✅ 2. 화이트리스트 방식 적용

허용된 파일 리스트를 사전에 정의하고, 그중에서만 선택할 수 있도록 제한하는 방식입니다.

List<String> allowedFiles = Arrays.asList("document1.txt", "report.pdf");
if (!allowedFiles.contains(fileName)) {
    throw new SecurityException("허가되지 않은 파일 접근");
}

✅ 3. 절대 경로 검사 (Canonical Path 활용)

getCanonicalPath()를 사용하여 파일이 특정 디렉터리를 벗어나지 못하도록 제한할 수 있습니다.

File file = new File("/var/www/uploads/", fileName);
if (!file.getCanonicalPath().startsWith("/var/www/uploads/")) {
    throw new SecurityException("비인가 파일 접근 차단");
}

✅ 4. 파일 시스템 권한 제한

  • 애플리케이션이 불필요한 디렉터리와 파일에 접근할 수 없도록 권한을 설정합니다.
  • 예를 들어, 업로드 디렉터리 외의 다른 시스템 파일에 접근할 수 없도록 해야 합니다.

🎯 마무리

디렉터리 트래버설은 개발자의 작은 실수 하나로 인해 시스템 파일 유출, 민감한 정보 노출 등의 심각한 보안 문제가 발생할 수 있는 취약점입니다. 따라서:

  • 사용자 입력값을 직접 파일 경로로 사용하지 말 것
  • 화이트리스트 기반 파일 접근 제한 적용
  • 절대 경로 검사 및 파일 권한을 강화

위와 같은 보안 조치를 적용하여 안전한 파일 접근 로직을 설계하는 것이 중요합니다.

💡 웹 애플리케이션을 개발할 때, 보안은 선택이 아니라 필수입니다!