import java.io.*;
import javax.servlet.http.*;
public class FileController {
public void downloadFile(HttpServletRequest request, HttpServletResponse response) throws IOException {
String fileName = request.getParameter("fileName");
// [취약한 코드] 외부 입력값인 fileName을 검증 없이 사용하여
// ../와 같은 경로 순회 문자로 시스템 파일 접근이 가능하다.
File file = new File("/data/uploads/" + fileName);
if (file.exists()) {
FileInputStream fis = new FileInputStream(file);
// ... 파일 전송 로직 ...
}
}
}
Apache Commons IO 라이브러리의 getName() 메서드는 경로 정보를 모두 제거하고 파일명만 반환합니다.
라이브러리를 사용할 수 없는 경우, 경로 순회 문자를 체크하여 예외 처리합니다.
공격자가 ../../etc/passwd와 같은 입력을 통해 허용되지 않은 상위 디렉터리의 파일에 접근하는 것을 막아야 합니다.
Path Traversal (CWE-22)
입력값을 그대로 경로에 결합하면 운영체제의 파일 시스템 경로 해석 규칙에 따라 의도치 않은 파일이 노출될 수 있습니다.