파일의 확장자 및 형식에 대한 검증없이 파일 업로드를 허용하는 보안약점이다.

위협 요소

  • 특정 파일을 처리하는 과정의 취약점을 통해 공격 가능
    • 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를 사용할 것
  • 사용자의 행동을 기록할 것
  • 압축 파일의 압축 해제 시, 새로 생기는 파일 각각에 대해 검사할 것

참조