RequestDispatcher를 통한 파일 노출
File Disclosure via RequestDispatcher
Last updated
File Disclosure via RequestDispatcher
Last updated
import java.io.IOException;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletRequest;
import jakarta.servlet.ServletResponse;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.RequestDispatcher;
public class UnsafeServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String filePath = request.getParameter("file"); // 사용자 입력 사용
RequestDispatcher dispatcher = request.getRequestDispatcher(filePath);
dispatcher.forward(request, response); // 취약한 코드
}
}import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
public class SafeServlet extends HttpServlet {
private static final Map<String, String> allowedPaths = new HashMap<>();
static {
allowedPaths.put("home", "/home.jsp");
allowedPaths.put("profile", "/profile.jsp");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String userInput = request.getParameter("page");
// Lookup Table을 사용하여 허용된 페이지만 접근 가능하도록 설정
String safePath = allowedPaths.getOrDefault(userInput, "/home.jsp");
response.sendRedirect(safePath); // 안전한 리디렉션
}
}