본문 바로가기
Secure Coding

[시큐어 코딩] 위험한 형식 파일 업로드

by 수픽 2021. 8. 9.

서버 측에서 실행될 수 있는 스크립트 파일(asp, jsp, php 파일 등)이 업로드가능하고, 이 파일을 공격자가 웹을 통해 직접 실행시킬 수 있는 경우, 시스템 내부명령어를 실행하거나 외부와 연결하여 시스템을 제어할 수 있는 보안약점

 

 

- 화이트 리스트 방식으로 허용된 확장자만 업로드를 허용

- 파일명과 확장자를 외부사용자가 추측할 수 없는 문자열로 변경하여 저장

- 저장 경로는 ‘web document root’ 밖에 위치시켜서 공격자의 웹을 통한 직접 접근을 차단

- 파일 실행여부를 설정할 수 있는 경우, 실행 속성을 제거

 

 

ex) 업로드할 파일에 대한 유효성 검사

String fileName = multi.getFilesystemName("filename");
if (fileName != null) {
//1.업로드 파일의 마지막 “.” 문자열의 기준으로 실제 확장자 여부를 확인하고, 대소문자 구별을
해야한다.
  String fileExt =
  FileName.substring(fileName.lastIndexOf(".")+1).toLowerCase();
  
//2.되도록 화이트 리스트 방식으로 허용되는 확장자로 업로드를 제한해야 안전하다.
  	if (!"gif".equals(fileExt) && !"jpg".equals(fileExt) && !"png".equals(fileExt))
  {
      alertMessage("업로드 불가능한 파일입니다.");
      return;
      }
  }
  
  ..
  
  Thumbnail.create(savePath+"/"+fileName, savePath+"/"+"s_"+fileName, 150);

 

파이썬으로 바꿔보면)

1. 확장자 확인 및 대소문자 구별

pose = fileName.find('.')+1

fileExt =  fileName[pose].lower()

 

2. 화이트 리스트 방식으로 허용되는 확장자로 업로드 제한

if not ("gif".equals(fileExt) and "jpg".equals(fileExt) and "png".equals(fileExt)) :
    alertMessage("업로드 불가능한 파일입니다.")