본문 바로가기
정보보안/Web Hacking

파일 다운로드 취약점에서 자주 쓰이는 Path Traversal 취약점 정리 - filedownload, path traveral

by 우동이 2022. 8. 25.
300x250

파일 다운로드 취약점이란.

웹 서비스의 파일 시스템에 존재하는 파일을 다운로드하는 과정에서 발생하는 보안 취약점

공격자가 웹 서비스의 파일 시스템에 존재하는 임의 파일을 다운로드할 수 있다.

설정 파일, 암호 파일, DB 백업 파일 등 민감한 정보가 포함된 파일을 탈취하여 2차 공격의 수행 가능

 

파일 다운로드 취약점은 웹 해킹중 한 기법으로 

해당 웹 서비스의 임의 파일을 다운로드 하는 취약점입니다.

만약 서비스의 설정 파일이나 DB파일이 탈취된다면

개인정보를 통한 2차적인 공격이 가능해집니다.


파일 다운로드 취약점이 발생하는 웹 서비스 형태

 

파일 다운로드 취약점이 발생하는 URL 패턴은 다음과 같습니다.

위 주소들은 전부 URL 내에서 파일에 대한 경로로 접근이 가능하다는 것입니다.

그렇기에../ 의 파일 경로를 통해 접근하여 민감한 정보가 담긴 파일 다운로드가 가능해집니다.

 

이렇게 파일 이름을 직접 입력받아 임의의 디렉토리에 있는 파일을 다운로드 받는 취약점이

Path Traversal 취약점입니다.


이는 또한 사용자의 입력을 검증하지 않음으로 인해 파일 다운로드 취약점이 또 발생합니다.

...
@app.route("/download")
def download():
	filename = request.args.get("filename","")
	return open("uploads/" + filename,"rb").read()

위 코드를 살펴보면 단순히 파일이름을 받아 아무런 검증을 거치지 않습니다.

그 후 검증 없이 다운로드 기능을 제공합니다.


파일 다운로드 취약점 방지법

파일 다운로드 취약점 방지에는 크게 두 가지가 존재한다고 할 수 있습니다.

 

1. path traversal 이 가능한 상대 경로 (../,  \\) 문자열 필터링

2. 웹 서비스 자체를 파일의 경로나 이름을 넘기지 않는 방식으로 구현

 

이 두 가지 사항이 파일 다운로드 취약점 방지의 가장 핵심이라고 할 수 있습니다.

 

애초에 파일 경로를 웹서비스 내에서 주고받을 수 있다는 게 위험한 취약점으로 이어질 수 있기 때문입니다.

 

물론../ 문자열을 필터링한다고 해도..././ 등과 같이 다양한 우회가 가능하기 때문에

제대로 된 필터링이 필요합니다.

 

@app.route("/download")
def download():
    file_id = request.args.get("file_id", "") # file_id는 쉽게 유추하지 못하는 랜덤한 값이어야 합니다.
    file_path = find_path_from_database(file_id) # find_path_from_database 함수는 데이터베이스에서 file_id와 매핑된 파일 경로를 반환하는 개발자가 작성한 함수입니다.
    if file_path is None:
        return "올바르지 않은 파일 아이디입니다."
    return open(file_path, "rb").read()

 

최근에 드림핵 파일 취약점 문제를 풀다가 영 막혀가지고 정리해봤습니다.

다음번에는 예제를 가지고 실습 내용을 적어봐야겠습니다.

300x250

댓글