의견.png

"파일업로드"의 두 판 사이의 차이

해시넷
이동: 둘러보기, 검색
(참고자료)
(같이 보기)
102번째 줄: 102번째 줄:
  
 
==같이 보기==
 
==같이 보기==
 
+
[[자바서블렛]]
 
{{솔루션|토막글}}
 
{{솔루션|토막글}}

2020년 9월 18일 (금) 16:13 판

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

구조

라이브러리

com.oreilly.servlet

com.oreilly.servlet 다운로드 사이트
  • 특징 : 스트림으로 구현하는 파일업로드 기능에서 입출력스트림 기능을 간편하게 제공해준다. JSP 이외에 자바 파일에서도 사용이 가능하다.
  • 주요 기능 : 보통 웹 프로젝트에서 라이브러리 디렉토리에 넣고 사용하며 파일 업로드 처리 뿐만 아니라 매개변수 구문 분석, 멀티 파트 응답 생성, 파일반환, 소켓 연결관리, 원격 함수 호출 서버 역할을 할 수 있도록 그리고 애플릿과 통신할 수 있도록 도와주는 클래스이다.
  • 활용 : cos.jar 파일을 라이브러리 디렉토리에 추가한 후 라이브러리를 활용하여 파일 업로드를 하기 위해선 form 태그에 enctype="multipart/form-data" 부분이 명시되어야 한다. 또한 인풋타입을 지정할때 파일로 지정해 주면된다. [1]
 예제
〈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); 서버상에 업로드된 파일에 대한 객체를 반환한다.[2]

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를 사용한다는 점이다.[3]
예시
<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를 관리하는 부분이다.[4]
 예제
〈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라이브러리는 웹 페이지에서 사용자가 저장 버튼을 선택하면, 지정된 함수가 호출되어 사용자가 입력한 값을 확인하는 것 까지는 동일하지만 파일을 먼저 서버에 전송해서 저장한 후 파일 저장이 끝나면 지정된 콜백함수를 실행하면서 파라미터 값들이 넘어오고 이 값들을 서버에 전송하는 것이다.[5]

취약점

  • 피해 범위 : 웹사이트에 악성 스크립트를 이용하여 해당 서버에서 시스템 쉘 명령을 실행하여 시스템의 구조를 파악할 수 있다. 웹쉘(Web Shell)을 통해 공격을 진행하며 백도어(Backdoor)를 업로드해 사용자 인증없이 서버나 다른 계정에 접속 가능하게 만들어 치명적인 결과를 만들어낼 수 있다.[6]
  • 공격조건 : 일단 당연하게도 파일이 업로드 가능한 환경에서 일어나며 파일이 업로드된 디렉토리의 경로를 알아야한다. 또한 디렉토리 경로를 알았다면 업로드된 디렉토리에 대한 실행 권한이 있어야 공격이 가능하다.
  • 원인 : 웹 서비스를 이용하여 서버측의 명령을 실행할 수 있는 악의적인 목적의 스크립트 파일인 웹셀을 실행할 수 있다. php나 jsp는 서버측에서 동적인 처리를 위하여 사용하는 언어인데 php나 jsp를 활용해 데이터베이스와 통신할 수 있게 만들어준다. 이렇게 할 수 있는 원인은 php나 jsp 언어를 사용하면 리눅스 시스템 명령을 실행할 수 있기 때문이다.[7]
  • 대응방법 : 시큐어 코딩을 하고 취약점 패치를 진행해야한다. 대표적으로 악성 스크립트에 포함될 수 있는 키워드나 명령어에 대한 문장을 필터링할 수 있게 만들고 업로드 파일의 확장자 및 실행권한을 제한하는 방법이 있다.

각주

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

참고자료

같이 보기

자바서블렛

  의견.png 이 파일업로드 문서는 솔루션에 관한 토막글입니다. 위키 문서는 누구든지 자유롭게 편집할 수 있습니다. [편집]을 눌러 이 문서의 내용을 채워주세요.