본문 바로가기
Web Security/SecureCoding

위험한 형식 파일 업로드

by KkingKkang 2022. 11. 15.

- 업로드하는 파일 타입과 크기를 제한하고, 업로드 디렉터리를 웹 서버의 다큐먼트 외부에 설정한다.

- 화이트리스트 방식으로 허용된 확장자만 업로드되도록 하고, 확장자도 대소문자 구분 없이 처리하도록 한다.

- 공격자의 웹을 통한 직접 접근을 차단한다, 또한, 파일 실행 여부를 설정할 수 있는 경우, 실행 속성을 제거한다. 

> 보안에서 화이트리스트란 기본 정책이 모두 차단인 상황에서 예외적으로 접근이 가능한 대상을 지정하는 방식 또는 그 지정된 대상들을 말한다.블랙리스트 반대 개념.

 

안전하지 않은 코드 ▼

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

 

안전한 코드

public void upload(HttpServletRequst request) throws ServletException {
	MultipartHttpServletRequest mRequest = (MultipartHttpServletRequset) request;
    String next = (String) mRequest.getFileNames().next();
    MultipartFile file = mRequest.getFile(next);
    if ( file == null )
    	return;
        
    //업로드 파일 크기를 제한한다.
    int size = file.getSize();
    if ( size > MAX_FILE_SIZE ) throw new ServletException("에러");
    
    //MultipartFile로 부터 file을 얻음
    String fileName = file.getOriginalFilename().toLowerCase();
    
    //화이트 리스트 방식으로 업로드 파일의 확장자 체크
    if( fileName != null ) {
    if(fileName.endsWith(".doc")||fileName.endsWith(".hwp")||fileName.endsWith(".pdf")||
    	fileName.endsWith(".xls") ) {
        	/* 파일 업로드 */
     } else throw new ServletException("에러");
     
     //업로드 파일의 디렉터리 위치는 다큐먼트 루트의 밖에 위치시킨다.
     File uploadDir = new File("/app/webapp/data/upload/notice");
     String uploadFilePath = uploadDir.getAbsolutePath() + "/" + fileName;
     
     }

 

 

반응형

'Web Security > SecureCoding' 카테고리의 다른 글

크로스사이트 요청 위조  (0) 2022.11.16
신뢰 되지 않는 URL 주소로 자동 접속 연결  (0) 2022.11.15
크로스 사이트 스크립트  (0) 2022.11.11
자원 삽입  (0) 2022.11.11
SQL 삽입  (0) 2022.11.11

댓글