디렉터리 트래버설(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. 파일 시스템 권한 제한
- 애플리케이션이 불필요한 디렉터리와 파일에 접근할 수 없도록 권한을 설정합니다.
- 예를 들어, 업로드 디렉터리 외의 다른 시스템 파일에 접근할 수 없도록 해야 합니다.
🎯 마무리
디렉터리 트래버설은 개발자의 작은 실수 하나로 인해 시스템 파일 유출, 민감한 정보 노출 등의 심각한 보안 문제가 발생할 수 있는 취약점입니다. 따라서:
- 사용자 입력값을 직접 파일 경로로 사용하지 말 것
- 화이트리스트 기반 파일 접근 제한 적용
- 절대 경로 검사 및 파일 권한을 강화
위와 같은 보안 조치를 적용하여 안전한 파일 접근 로직을 설계하는 것이 중요합니다.
💡 웹 애플리케이션을 개발할 때, 보안은 선택이 아니라 필수입니다!
'Network' 카테고리의 다른 글
[Network] 데이터베이스 다중화: 확장성과 안정성을 위한 설계 (0) | 2025.01.11 |
---|---|
[Network] 시스템 확장을 위한 로드밸런서 설계: 부하 분산과 고가용성 확보 (0) | 2025.01.11 |
[Network] 사용자 수에 따른 규모 확장성: 수직적 확장과 수평적 확장 (0) | 2025.01.11 |
[Network] 웹 애플리케이션 및 모바일 앱의 서버와 데이터베이스 구조 개요 (0) | 2025.01.11 |
[네트워크 프로토콜] TCP/IP 프로토콜의 작동 원리와 최적화 전략 (0) | 2024.09.20 |