[구현보안] 입력 데이터 검증 및 표현 05 - 위험한 형식 파일 업로드
가. 원인
- 업로드되는 파일의 안정성을 검사하지 않고 업로드를 허용
- 서버측에서 실행될 수 있는 스크립트 파일(ASP, JSP, PHP 등)이 업로드 가능하며 웹을 통해 직접 실행가능
나. 영향
- 시스템 내부명령어를 실행
- 웹쉘 업로드를 통해 서버를 장악
- 키로거를 설치하여 인증정보 획득
- 악성코드가 포함된 파일을 업로드하여 사용자 PC를 감염
다. 보안대책
- 화이트리스트 방식으로 허용된 확장자만 업로드를 허용
- 업로드 파일의 크기와 갯수를 제한
- 업로드 파일의 종류를 제한
- 외부에서 접근할 수 없는 경로(Web Document Root 밖에 위치)에 파일저장
- 업로드 파일의 저장경로 및 파일명을 외부에 노출 금지
- 업로드 파일의 실행권한을 제거 후 저장
라. 안전한 코드
1. 파일 확장자 검증
String fileName = multipart.getFilesystemName("filename"); /* 대소문자 구분없이 검증하기 위해 소문자로 변경 */ String fileExt = fileName.substring( fileName.lastIndexOf(".") + 1).toLowerCase(); if ( gif.equals(fileExt) || jpg.equals(fileExt ) { ... Thumbnail.create(savePath + "/" + fileName, savePath + "/s_" + fileName, 150); ... }
|
마. 진단방법
<확장자 검증>
1. 외부 입력값에서 파일명을 얻어오는 부분이 존재하는지 확인
2. 허용된 확장자에 대해서만 업로드를 허용하는지 확인
바. 정/오탐 케이스
<정탐 케이스>
1. 파일 업로드 시 확장자를 체크하지 않을 경우
2. 블랙리스트 방식으로 확장자를 체크하는 필터링에서 대소문자를 구분하여 체크하는 경우
<오탐 케이스>
1. 파일 업로드 시 확장자를 체크하여 필터링할 경우
2. 업로드한 파일의 데이터를 안전한 확장자의 파일의 데이터로 복사하여 사용할 경우