Secure Coding Guide | 위험한 형식 파일 업로드


정의

파일확장자등파일형식에대한검증없이업로드를허용해발생할수있는보안약점

영향

시스템 침해 사고 유발한다. 웹셀 공격이 가능해 진다.

조치 방법

업로드 파일에 대한 검증을 수행하지 않을 경우 발생한다.

안전하지 않은 Java 코드 일부

public void upload(HttpServletRequest request) throws ServletException {
    MultipartHttpServletRequest mrequest = (MultipartHttpServletRequest) request;
    String next = (String) mrequest.getFileNames().next();
		MultipartFile file =  mrequest.getFile(next);
    // MultipartFile로부터 file을 얻음
    String filename = file.getOriginalFilename();
    // upload 파일에 대한 확장자 체크하지 않음
    File uploadDir = new File("/app/webapp/data/upload/notice");
		String uploadFilePath = uploadDir.getAbsolutePath()+"/" + fileName;
}

업로드 파일에 대한 검증을 수행하지 않았다.

안전한 Java 코드 일부

String next = (String) mrequest.getFileNames().next();
MultipartFile file = mrequest.getFile(next);
if ( file == null )
    return ;
// 화이트리스트 방식으로 업로드 파일의 확장자 체크
if ( fileName != null ) {
    if ( fileName.toLowerCase().endsWith(".doc") || fileName.toLowerCase().endsWith(".hwp")
    || fileName.toLowerCase().endsWith(".pdf") || fileName.toLowerCase().endsWith(".xls") ) {
    /* file 업로드 루틴 */
    // 저장 시 파일명을 외부 사용자가 추측할 수 없는 형태로 변경 ...
    /* 이하 file upload 루틴 */

업로드 파일에 대한 확장자를 화이트 방식으로 체크하며, 이때 확장자 대 소문자 방지 우회 방지를 위해 저장시 파일명을 외부 사용자가 추측 할 수 없는 형태로 변경하거나, 실행 되지 않는 형태로 저장한다. 저장 장소는 웹에서 접근이 불가능하거나 실행권한을 주지 않는다.