검수요청.png검수요청.png

파일업로드

해시넷
이동: 둘러보기, 검색

파일업로드(File Upload)란 파일 데이터를 하류 노드에서 상류 노드로 전송하는 것을 말한다. 전송할 때는 파일 전송 프로토콜(FTP)을 사용한다.

구조[편집]

파일업로드 흐름

파일 업로드는 위와 같은 과정으로 이루어진다. 일단 제일 처음에 파일업로드를 구성하기 위한 화면이 제공되고 해당 페이지에서 업로드 기능을 수행한다면 업로드 서비스가 진행이 되며 데이터베이스와 통신을 통한다. 데이터페이스는 리스트를 출력하는 쿼리에 대한 반환을 해주고 리스트에 대한 출력을 지원한다. 해당 기능은 보통 서버 내부에서 관리자의 입장에서 사용하는 기능이므로 사용자 페이지에선 전체 파일 목록에 대한 출력을 구현하지 않는다. 항목이 추가 되었다면 다시 한번 업로드 서비스를 거쳐 파일 전송을 완료한다. 만약 이미지 파일 이라면 해당 항목에 이미지 파일을 미리보기 화면으로 출력하는 기능을 지원하게 구현할 수도 있다.[1]

라이브러리[편집]

com.oreilly.servlet[편집]

com.oreilly.servlet 다운로드 사이트
  • 특징 : 스트림으로 구현하는 파일업로드 기능에서 입출력스트림 기능을 간편하게 제공해준다. JSP 이외에 자바 파일에서도 사용이 가능하다.
  • 주요 기능 : 보통 웹 프로젝트에서 라이브러리 디렉토리에 넣고 사용하며 파일 업로드 처리 뿐만 아니라 매개변수 구문 분석, 멀티 파트 응답 생성, 파일반환, 소켓 연결관리, 원격 함수 호출 서버 역할을 할 수 있도록 그리고 애플릿과 통신할 수 있도록 도와주는 클래스이다.
  • 활용 : cos.jar 파일을 라이브러리 디렉토리에 추가한 후 라이브러리를 활용하여 파일 업로드를 하기 위해선 form 태그에 enctype="multipart/form-data" 부분이 명시되어야 한다. 또한 인풋타입을 지정할때 파일로 지정해 주면된다. [2]
 예제
〈form name="fileForm" id="fileForm" method="POST" action="fileUpload.jsp" enctype="multipart/form-data"〉〈/form〉
  • 주요메소드
메소드 반환타입 정의 내용
getParameterNames() java.util.Enumeration Enumeration params = multi.getParameterNames(); 생성된 MultipartRequest 객체는 multi 레퍼런스를 통해서 생성된 MultipartRequest 객체가 가지고 있는 메소드를 사용할 수 있다. getParameterNames() 메소드는 폼에서 전송한 파라미터들의 이름을 Enumeration 타입으로 반환한다. 폼에 있는 input 태그중 file 속성이 아닌 모든 파라미터들의 이름을 반환하는 메소드 이다.
getParameter(java.lang.String name) java.lang.String String paramValue=multi.getParameter(java.lang.String name); request 객체에서 사용되는 getParameter 메소드 처럼 파라미터의 이름을 인자로 받아서 그 파라미터의 값을 반환하는 메소드이다. 이 메소드에 전달될 인자는 getParameterNames()메소드를 통해서 얻어온 파라미터이름을 인자로 주면 그 파라미터에 담긴 값을 반환한다.
getFileNames() java.util.Enumeration Enumeration filses = multi.getFileNames(); 폼 요소중 input 태그에서 file 속성으로 지정된 태그의 name 속성의 값, 즉 file 속성을 가진 파라미터의 이름을 Enumeration 객체 타입으로 반환 한다.
getFilesystemName() java.lang.String String filename = multi.getFilesystemName(name); file속성으로 지정된 input태그에 의해 서버상에 실제로 업로드된 파일 이름을 String 객체 타입으로반환한다. 이 메소드가 반환하는 파일명은 file 속성을 가진 input 태그에서 사용자가 지정한 파일 이름이 아니고 사용자가 선택한 파일이 실제 서버상의 폴더에 저장되었을때의 파일명을 반환한다.
getOriginalFileName() java.lang.String String original = multi.getOriginalFileName(name); 사용자가 직접 지정한 파일명을 반환한다. MultipartRequest 클래스의 생성자 중 중복된 파일을 덮어쓰는 것을 방지하기 위해 사용되는 FileRenamePolicy 인터페이스를 구현한 DefaultFileRenamePolicy 클래스에 의해서 파일명이 변경되기전의 파일명을 반환한다.
getContentType() java.lang.String String type = multi.getContentType(name); 업로드된 파일의 콘텐츠 타입을 반환한다.
getFile() java.io.File File file = multi.getFile(name); 서버상에 업로드된 파일에 대한 객체를 반환한다.[3]

Apache Commons Upload[편집]

설명
  • 특징 : 기본적인 기능이나 특징은 자바서블렛에서 제공하는 com.oreilly.servlet과 비슷하다. 마찬가지로 multipart/form-data 인코딩 타입을 가져가는 것 또한 동일하다. HTTP 요청을 POST 방법으로 전송하고 multipart/form-data의 콘텐츠 유형을 사용하여 파일업로드에서 해당 요청을 구문 분석할 수 있으며, 그 결과를 발신자가 쉽게 사용할 수 있는 방식으로 이용할 수 있도록 할 수 있다.
  • 활용 : 라이브러리 디렉토리에 추가한 후 라이브러리를 활용하여 파일 업로드를 하기 위해선 form 태그에 enctype="multipart/form-data" 부분이 명시되어야 한다. 또한 인풋타입을 지정할때 파일로 지정해 주면된다. cos.jar 파일의 설정과 차이점은 action에 fileUpload.jsp 대신 fup.cgi를 사용한다는 점이다.[4]
예시
<form method="POST" enctype="multipart/form-data" action="fup.cgi">
  File to upload: <input type="file" name="upfile">
Notes about the file: <input type="text" name="note">

<input type="submit" value="Press"> to upload the file! </form>

GUUpload[편집]

GUUpload
  • 특징 : gu-upload는 웹 사이트에서 파일을 업로드하는 HTML5 기반 자바스크립트(JavaScript) 라이브러리이다. 기본적으로 HTML5 기반이기 때문에 인터넷 익스플로러(Internet Explorer), 파이어폭스(Firefox), 크롬(Chrome)에서 실행된다. 그리고 인터넷 익스플로러 9 버전 이전의 웹 브라우저에서는 플래시로 제작된 SWFUpload가 실행된다.
  • 주요 기능 : 탐색기에서 드래그 앤 드롭(Drag & Drop)으로 파일을 추가하거나, gu-upload를 더블 클릭하여 파일을 추가할 수 있다. 여러 개의 파일을 선택해서 업로드 및 전송 상태를 표시할 수 있고 추가한 파일을 리스트나 미리보기로 설정해서 사용이 가능하다. 기타 사항으로 파일 크기나 개수를 제한 할 수 있는 기능이 있다.
  • 활용 : 깃허브에 있는 gujc71 유저의 gu-upload 레포지토리를 통해 해당 라이브러리를 이용할 수 있다. guuploadManager.js 파일과 guupload.css 파일이 스크립트와 스타일을 정의하고있으며 gu-upload를 사용하기 위해서 다음 예제의 마크업 선언을 통해 사용할 수 있다. guupload.css는 해당 라이브러리에서 사용하는 모든 디자인 클래스를 모아놓은 파일로 사용하는 사람의 맞추어서 수정하여 사용하면 되고 guupload.Manager.js는 guupload와 SWFUpload를 관리하는 부분이다.[5]
 예제
〈link rel="stylesheet" type="text/css" href="js/gu-upload/css/guupload.css"/〉
〈script type="text/javascript" src="js/gu-upload/guuploadManager.js"〉〈/script〉
GUUpload 와 일반 업로드의 차이점
  • 차이점 : 일반적인 웹페이지에서는 사용자가 입력한 값들과 첨부 파일을 같이 전송한다. 예를 들어 게시판에 글과 사진을 첨부하여 작성하였을 때 제목, 글 내용 등의 입력 값과 첨부된 파일을 한 번에 서버로 전송한 뒤 파일을 저장하고, 파일명과 제목, 글 내용들을 데이터베이스에 저장한다. 하지만 guupload 라이브러리를 사용하는 경우에는 첨부파일을 먼저 서버에 전송해서 저장을 한 후 서버네거 저장한 실제 파일명을 받아와서, guupload가 가지고 있는 파일명, 파일크기를 조합한 후 guupload 객체 생성시 옵션으로 지정학 콜백함수로 넘겨준다. 콜백함수에서는 넘겨 받은 파일 정보를 사용자가 입력한 값과 같이 서버에 넘겨서 데이터베이스에 저장한다. 한마디로 일반적인 웹 페이지에선 사용자가 저장 버튼을 누르면 지정된 함수가 호출되어 사용자가 입력한 값을 확인하고 입력값과 파일을 서버로 전송하지만 guupload라이브러리는 웹 페이지에서 사용자가 저장 버튼을 선택하면, 지정된 함수가 호출되어 사용자가 입력한 값을 확인하는 것 까지는 동일하지만 파일을 먼저 서버에 전송해서 저장한 후 파일 저장이 끝나면 지정된 콜백함수를 실행하면서 파라미터 값들이 넘어오고 이 값들을 서버에 전송하는 것이다.[6]

취약점[편집]

  • 피해 범위 : 웹사이트에 악성 스크립트를 이용하여 해당 서버에서 시스템 쉘 명령을 실행하여 시스템의 구조를 파악할 수 있다. 웹셸(Web Shell)을 통해 공격을 진행하며 백도어(Backdoor)를 업로드해 사용자 인증없이 서버나 다른 계정에 접속 가능하게 만들어 치명적인 결과를 만들어낼 수 있다.[7]
  • 공격조건 : 일단 당연하게도 파일이 업로드 가능한 환경에서 일어나며 파일이 업로드된 디렉토리의 경로를 알아야한다. 또한 디렉토리 경로를 알았다면 업로드된 디렉토리에 대한 실행 권한이 있어야 공격이 가능하다.
  • 원인 : 웹 서비스를 이용하여 서버측의 명령을 실행할 수 있는 악의적인 목적의 스크립트 파일인 웹셀을 실행할 수 있다. php나 jsp는 서버측에서 동적인 처리를 위하여 사용하는 언어인데 php나 jsp를 활용해 데이터베이스와 통신할 수 있게 만들어준다. 이렇게 할 수 있는 원인은 php나 jsp 언어를 사용하면 리눅스 시스템 명령을 실행할 수 있기 때문이다.[8]
  • 대응방법 : 시큐어 코딩을 하고 취약점 패치를 진행해야한다. 대표적으로 악성 스크립트에 포함될 수 있는 키워드나 명령어에 대한 문장을 필터링할 수 있게 만들고 업로드 파일의 확장자 및 실행권한을 제한하는 방법이 있다. 항상 검증된 웹셀만을 올려야 하며 웹셸 취약점 점검 이후 후속 조치를 통해 업로드 했던 웹셀은 반드시 삭제 해야한다. 업로드 기능이 불필요할 경우 개발단계에서 완전히 제거해야하며 소스코드단에서 편의흫 위해 주석처리하는 등 지양해야한다. 파일 업로드 기능이 필요한 경우에는 서버측에서 파일명을 검사해야한다. 업로드되어 있는 저장되는 파일의 타입, 크기, 개수, 실행 권한을 제한 하고 업로드 되어 저장되는 파일은 외부에서 식별 되지 않아야한다. 프레임워크의 종류를 고려하여 목적에 부합하지 않는 파일은 필터링한다.

각주[편집]

  1. 털 업, 〈웹에서 파일 업로드 구현하기 -1〉, 《티스토리》, 2017-11-24
  2. 자바서블렛 공식홈페이지 - http://www.servlets.com/
  3. 유능해질래요, 〈(JSP) cos.jar 파일 다운로드 및 설정〉, 《네이버 블로그》, 2012-06-28
  4. 아파치 커먼즈 공식홈페이지 - http://commons.apache.org/proper/commons-fileupload/
  5. gujc71, 〈gu-upload〉, 《깃허브》, 2019-07-28
  6. SW 개발이 좋은 사람, 〈3. 파일 업로드 라이브러리: gu-upload 2019버전〉, 《티스토리》, 2019-07-28
  7. Luuii , 〈백도어(Backdoor)〉, 《티스토리》, 2017-11-27
  8. 기르르, 〈파일 업로드/다운로드 취약점 - 업로드〉, 《티스토리》, 2020-04-08

참고자료[편집]

같이 보기[편집]


  검수요청.png검수요청.png 이 파일업로드 문서는 솔루션에 관한 글로서 검토가 필요합니다. 위키 문서는 누구든지 자유롭게 편집할 수 있습니다. [편집]을 눌러 문서 내용을 검토·수정해 주세요.