웹쉘
웹 사이트의 파일 업로드 기능을 이용하여 인가 받지 않은 파일을 서버에 임의로 업로드 하는 공격이다. 주로 파일의 형식은 .asp, .php, .jsp과 같으며 이를 웹셀이라고 한다. 이러한 악성 스크립트를 올려 실행시킨 후, 웹 서버를 장악하고 피해를 주는 행위이다.
+ 확장자만 검사하는 것이 아닌, Mime-Type 또한 검사하는 과정이 필요하다.
Mime-Type
Mime은 다목적 인터넷 메일 확장이라는 뜻으로 전자우편의 데이터 형식을 정의한 표준 포맷이다. 이는 전자우편에서 사용하기 위해 등장했지만 지금은 HTTP 통신에서 전송 데이터를 표현하기 위해서도 사용하고 있다.
Java의 Mime-Type을 검사하는 라이브러리로 Apache Tika가 있다. 이는 파일의 메타 데이터와 텍스트 등을 탐지하고 추출하는데 사용되는 라이브러리다. Tika 라이브러리는 확장자가 아닌 실제 파일의 내용을 검사하여 Mime-Type을 판단하고, 파일이 존재하지 않으면 FileNotFouneException을 발생시킨다.
+ Spring Boot의 MultipartFile에서는?
Spring Boot의 MuptipartFile 또한 실제 파일의 내용을 검사하여 Mime-Type을 검사하는 것 같다.
아래와 같이 텍스트 파일을 만들고
Mime-Type을 추출할 때 file.getContentType()
, 파일 확장자를 추출할 때 FilenameUtils.getExtension(file.getOriginalFilename())
을 사용하고 출력해봤을 때...
Mime-Type 및 파일 확장자를 제대로 추출하는 것을 확인할 수 있었다.
파일 다운로드 시 경로 및 파일 명을 처리하는 경우 이를 제대로 필터링하지 않았을 때 허용되지 않은 파일을 다운받을 수 있고 임의의 위치에 있는 파일을 열람하거나 다운받는 것을 가능하도록 하는 취약점이다.
파일 다운로드를 할 수 있도록 하는
URL 파라미터에 파일 이름 혹은 파일 번호를 할당하여 데이터를 처리하는 방식
ex) ... /photo?fileName=temp.png
파라미터 변조를 통해 서버의 시스템 파일 혹은 프로그램 소스에 접근할 수 있는 가능성을 가져 보안상 매우 위험하다.
특정 디렉터리에 파일 링크를 걸어 사용자에게 제공하는 방식
ex ) ... /photo/temp.png
파라미터 정보를 가지고 있지 않아 변조할 수 없는 안전한 구조이다.
NULL Byte 문자열은 문자열의 끝을 의미하기 때문에 특정 확장자를 숨기기 위한 목적으로 사용할 수 있다.
웹 서버에서 파일을 저장할 때 %00가 포함된 뒷 문자열은 null로 인식되는 것을 악용하는 방식이다. 업로드를 허용하는 확장자를 알고 있다면 해당 방식을 사용할 때 허용하는 확장자와 원하는 확장자 사이에 %00을 이용해 업로드를 시도한다.
Reference
[보안] 파일 업로드 취약점
웹 개발을 위해 꼭 알아야하는 보안 공격
[시큐어 코딩] #5 위험한 형식 파일 업로드
웹 파일 업로드 보안 취약점