파일의 확장자 및 형식에 대한 검증없이 파일 업로드를 허용하는 보안약점이다.
위협 요소
- 특정 파일을 처리하는 과정의 취약점을 통해 공격 가능
- gif Resizing, 사진 라이브러리의 취약점
- 다른 취약점을 유발할 수 있음
- 파일 내에 코드를 삽입 후 실행시킬 수 있음
- 서버에서 구동되고 있는 다른 프로그램의 취약점을 공격할 수 있음
- 백신과 같은 실시간 감시 프로그램
- 웹쉘(Web Shell) 등이 실행될 수 있음
예시
- .jsp > jsp 코드가 실행될 수 있음
- .gif > Resizing 시 사진 라이브러리 Exploit 가능
- 대용량 파일 > 저장 공간 부족으로 인한 DoS 가능
- 악의적인 경로 및 이름 > 중요 파일 덮어쓰기 가능
약한 방어 방법
확장자 Black List
서버에서 실행가능한 확장자를 Black List에 등록하여 업로드 되지 못하도록 한다.
유의 사항
- 확장자에 대문자를 섞는 경우를 고려해야 함
- 파일 이름 끝의 공백이나 . 은 저장될 때 지워질 수 있음
- 파일에 2개 이상의 확장자가 붙어있을 수 있음
- NULL 뒤에 문자는 무시될 수 있음
- NTFS의 ADS(Alternate Data Stream)에서 사용하는 :를 이용하여 금지된 확장자의 파일을 만들 수 있음
- 공격자가 해당 파일을 수정할 수 없다면 위협적이지는 않다
확장자 White List
위협적이지 않은 확장자를 White List에 등록하여 그 파일들만 업로드 되도록 한다.
유의 사항
- 해당 방법 외에 다른 방법을 겸용해야 한다
- White List 내의 확장자가 서버에 위협이 되지 않는다는 것을 보장해야 한다
Header의 Content-Type 검사
해당 항목은 패킷에서 표현하는 확장자와 유사하기 때문에 White/Black List를 적용할 수 있다.
유의 사항
- Local Proxy를 이용하여 해당 항목의 변조가 가능하다
파일 형식 검사기 사용
확장자가 아닌 파일 헤더를 이용해서 파일 형식을 판별한다
유의 사항
- 정상적인 파일 헤더 이 후에 악성 코드가 삽입되어 있을 수 있다
- 파일 처리에 영향을 주지 않는 주석 부분 등에 악성 코드가 삽입되어 있을 수 있다
권고 사항
- White List는 반드시 적용할 것
- 하나의 ”.” 이외에 다른 제어 문자를 허용하지 말 것
- [a-zA-Z0-9]{1,200}.[a-zA-Z0-9]{1,10}
- NTFS 파티션에서 문제가 될 수 있기 때문에 파일 이름의 길이를 255자 미만으로 제한한다
- 파일 이름을 결정할 때 “파일 이름 + 날짜”의 MD5sum 등을 이용한다
- 파일이 업로드 되는 디렉토리에는 절대 실행 권한을 부여하지 말 것
- DoS를 방지하기 위해 파일의 용량을 제한할 것
- 매우 작은 크기의 파일도 DoS에 사용될 수 있으니 최소 제한도 고려해 볼 것
- 같은 Hash로 인해 파일이 덮어씌어지는 것을 방지할 것
- 실시간 감시 시, 파일은 확장자 없는 임의의 파일 이름을 가진 상태에서 검사되어야 한다
- PUT/GET이 아닌 POST Method를 사용할 것
- 사용자의 행동을 기록할 것
- 압축 파일의 압축 해제 시, 새로 생기는 파일 각각에 대해 검사할 것