IT/앱사용방법

시큐어코딩) 파이썬 파일 업로드 공격 예방 하는 방법(기초)

볼통통알파카 2022. 6. 2. 22:09
반응형
파일 업로드 공격이란?

서버 측에서 실행될 수 있는 스크립트(asp, jsp, php, sh 등)파일 등 이 업로드 가능하면, 이 파일을 통해 공격자가 웹서버에서 직접 접근 기반을 마련하는 공격 기법이다.

 

 

파일 업로드 공격 방법

1. 공격자가 실행 가능한 파일을 서버에 업로드한다.

2. 파이썬에서 문자열 형식으로 표현된 형식을 인수로 받는다.

3. 인수를 반환하는 eval이나 인수로 받은 문자열을 실행하는 exec 함수를 같이 사용해 여러 변수들을 실행시킨다.

 

이는 웹 쉘 공격에 취약하게 만드는 방법이다.

 

파일 업로드 시큐어 코딩 예시

# 업로드 하는 파일에 대한 개수, 크기, 확장자 제한하는 설정
FILE_COUNT_LIMIT = 5    

# 업로드 하는 파일의 최대 사이즈 제한 (5MB - 5*1024*1024)
FILE_SIZE_LIMIT = 5242880    

# 화이트 리스트로 관리(허용 가능 확장자)
WHITE_LIST_EXT = [    
    '.jpg',
    '.jpeg'
]

def file_upload(request):
 # 파일 개수 제한
 if len(request.FILES) == 0 or len(request.FILES) > FILE_COUNT_LIMIT:
    return render(request, '/error.html', {'error': '파일 개수 초과'}) 
 for filename, upload_file in request.FILES.items():

 # 파일 타입 체크
 if upload_file.content_type != 'image/jpeg':
    return render(request, '/error.html', {'error': '파일 타입 오류'}) 

 # 파일 크기 제한
 if upload_file.size > FILE_SIZE_LIMIT:
    return render(request, '/error.html', {'error': '파일사이즈 오류'}) 

 # 파일 확장자 검사
 file_name, file_ext = os.path.splitext(upload_file.name)
 if file_ext.lower() not in WHITE_LIST_EXT:
    return render(request, '/error.html', {'error': '파일 타입 오류'}) 

 fs = FileSystemStorage(location='media/screenshot', base_url = 'media/screenshot')
 for upload_file in request.FILES.values():
    fs.save(upload_file.name, upload_file)

 return render(request, '/success.html', {'filename': filename})

이렇게 파일 개수 제한, 타입 체크, 크기 제한, 확장자 검사 등 점검하는 방법으로 위협을 최소화할 수 있다.

 

정리

1. 특정 파일 유형만 허용되도록 화이트 리스트 방식으로 업로드 제한

2. 확장자 및 업로드 파일의 Content-type 확인

3. 파일 크기 및 개수를 제한 설정

4. 업로드된 파일 이름을 무작위 값으로 변경하여 저장

5. 업로드 파일 저장 시 최소 권한만 부여 및 실행 권한 삭제

 

반응형