Spring ModelAndView를 통한 파일 노출
File Disclosure via Spring ModelAndView
Last updated
File Disclosure via Spring ModelAndView
Last updated
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.servlet.ModelAndView;
import jakarta.servlet.http.HttpServletRequest;
@Controller
public class UnsafeController {
@GetMapping("/view")
public ModelAndView unsafeView(HttpServletRequest request) {
String viewName = request.getParameter("page"); // 사용자 입력 사용
return new ModelAndView(viewName); // 취약한 코드
}
}import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
@Controller
public class SafeController {
private static final Map<String, String> allowedViews = new HashMap<>();
static {
allowedViews.put("home", "home");
allowedViews.put("profile", "profile");
}
@GetMapping("/view")
public ModelAndView safeView(@RequestParam(name = "page", required = false, defaultValue = "home") String page) {
// Lookup Table를 통한 whitelist 기반 검증
String safeView = allowedViews.getOrDefault(page, "home");
return new ModelAndView(safeView);
}
@GetMapping("/redirect")
public void safeRedirect(@RequestParam(name = "page", required = false, defaultValue = "home") String page,
HttpServletResponse response) throws IOException {
String redirectPath = allowedViews.getOrDefault(page, "/home");
response.sendRedirect(redirectPath); // 안전한 리디렉션
}
}