파일 다운로드 취약점은 해커가 허용된 경로 외 다른 경로의 파일을 열람하거나 다운받는 취약점을 의미 합니다.
일반적인 이미지나 텍스트 파일 같은경우에는 사실 크게 문제가 되지 않습니다만 사용자가 권한과 인증을통해서 올린 파일이나 또는 서버 내부의 시스템 설정과 관련된 파일을 받게 된 다면 이를 악용 할 수 있기 때문에 반드시 조치가 되어야 합니다.
#방법1
파일 다운로드 기능을 구현 할 때는 사용자의 요청을 파일이름 또는 경로를 받게 해서는 안됩니다.
고유 인덱스 번호를 통해서 스트림 형식으로 파일을 반환하는 방법을 사용해야 합니다.
아래 처럼 파일을 받게 해 준 다면 해커는 쉽게 원하는 파일을 받을수가 있습니다.
#이러한 파일요청 방식이 존재한다고 가정하여 봅니다.
https:127.0.0.1/board/download?path=download&file_name=test.png
#해커는 path와 file_name 등의 의미를 분석하여 아래처럼 요청 할 수 있습니다.
https:127.0.0.1/board/download?path=../../../../../../etc&file_name=passwd
아래 메소드는 간략하게 설명을 위해 만들어놓은 메소드 입니다.
아래처럼 특정 인덱스값을 받아서 파일경로 및 파일이름을 가져와서 반환하도록 해야 합니다.
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.HashMap;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.io.IOUtils;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class 컨트롤러 {
@RequestMapping(value="/다운로드요청")
@ResponseBody
public void 다운로드메소드(@RequestParam HashMap<Object, Object> param, HttpServletResponse response){
if(param.get("파일인덱스") != null) {
String file_idx = param.get("파일인덱스").toString();
InputStream inputStream =null;
try {
String file_name = "이곳에서 db에 조회해서 파일이름을 가져옵니다.";
response.setCharacterEncoding("UTF-8");
response.setHeader("Content-Type", "application/all");
response.setHeader("Content-Disposition", "attachment;filename="+file_name);
inputStream = new FileInputStream(new File(file_path + file_name));
IOUtils.copy(inputStream, response.getOutputStream());
response.flushBuffer();
} catch (Exception e) {
e.printStackTrace();
} finally {
if(inputStream != null) try {inputStream.close();} catch (Exception e) {e.printStackTrace();}
}
}
}
}
이상으로 표준취약점 파일다운로드(FD)에 대해서 간단하게 살펴보았습니다.
궁금한점 또는 틀린 부분은 언제든 연락주세요! 👻
반응형
'웹 취약점(Web vulnerability)' 카테고리의 다른 글
25. 경로 추적(PT) (0) | 2021.12.10 |
---|---|
24. 관리자 페이지 노출(AE) (0) | 2021.12.10 |
22. 약한 문자열 강도(BF) (0) | 2021.12.09 |
21. 파일 업로드(PU) (0) | 2021.12.09 |
20. 프로세스 검증누락(PV) (0) | 2021.12.09 |
* 위 에니메이션은 Html의 캔버스(canvas)기반으로 동작하는 기능 입니다. Html 캔버스 튜토리얼 도 한번 살펴보세요~ :)
* 직접 만든 Html 캔버스 애니메이션 도 한번 살펴보세요~ :)
댓글