파일 업로드 취약점 개요
서버 측에서 실행될 수 있는 스크립트 파일(asp, jsp, php 파일 등)을 업로드 가능하고, 이 파일을 공격자가 웹을 통해 직접 실행시킬 수 있는 경우 시스템 내부명령어를 실행하거나 외부와 연결하여 시스템을 제어할 수 있음
원인
파일의 저장위치
안전하지 않은 코드
public String boardWriteProc(@ModelAttribute("BoardModel") BoardModel boardModel, MultipartHTttpServletRequest request, HttpSession session) { String uploadPath = session.getServletContext().getRealPath("/")+"upload/"; MultipartFile file = request.getFile("file"); if ( file != null && ! "".equals(file.getOriginalFilename())) { String fileName = file.getOriginalFilename(); File uploadFile = new File(uploadPath + fileName); if(uploadFile.exists()) { fileName = new Date().getTime() + fileName; uploadFile = new File(uploadPath + fileName); } try { file.transferTo(uploadFile); } catch (Exception e) { System.out.println("upload error"); } boardModel.setFileName(fileName); }
안전한 코드
public String boardWriteProc(@ModelAttribute("BoardModel") BoardModel boardModel, MultipartHTttpServletRequest request, HttpSession session) { String uploadPath = session.getServletContext().getRealPath("/")+"WEB-INF/upload/"; MultipartFile file = request.getFile("file"); if (file != null && ! "".equals(file.getOriginalFilename()) && file.getSize() <= 10240000 && file.getContentType().contains("image") && file.getOriginalFilename().toLowerCase.endsWith(".jpg") { String savedFileName = null; File uploadFile = null; do { saveFileName=UUID.randomUUID.toString(); uploadFile=new File(uploadPath + savedFileName); } while(uploadFile.exist()); try { file.transferTo(uploadFile); } catch (Exception e) {System.out.println("upload error"); } boardModel.setFileName(fileName); } }
파일 다운로드 취약점 개요
경로조작 문자를 이용한 파일 다운로드 취약점
외부입력값에 대해 경로조작에 사용될 수 있는 문자를 필터링하지 않으면, 예상 밖의 접급제한 영역에 대한 경로 문자열 구성이 가능해져 시스템 정보 유출, 서비스 장애 등을 유발
대응방법
요청 파일명에 경로를 조작할 수 있는 ../\ 와 같은 문자를 제거하고 사용하거나, 다운로드에 사용되는 파일명은 서버에서 목록화 하여 지정된 목록 내 파일만 접근가능하도록 제한
_1. 파일의 타입이나 크기, 개수, 저장위치, 저장되는 파일명들을 철저히 통제하지 않으면 웹쉘과 같은 파일을 업로드하여 공격자가 원하는 명령을 실행할 수 있습니다.
2. 파일다운로드를 위해 전달되는 파라미터값에 포함된 경로를 조작하여 허가되지 않은 파일의 다운로드를 요청할 수 있습니다.
파일명을 조작할 수 있는 입력값들은 필터링을 통해 안전하게 걸러내고 사용하여 허가된 파일만 다운로드 할 수 있도록 제한해야 합니다.