파일 다운로드 취약점

강혜인·2025년 5월 29일

WEB_Hack

목록 보기
6/18

상대 경로, 절대 경로


절대 경로

  • 어떠한 웹 페이지나 파일이 가지고 있는 고유한 경로, 절대적으로 변하지 않는 경로
  • 파일의 root부터 해당 파일까지의 전체 경로를 의미
  • 루트 디렉터리부터 경로를 추적 → 절대 경로는 항상 / 기호로 시작
  • / : root

상대 경로

  • 현재 파일의 위치를 기준으로 연결하려는 파일의 상대적인 경로를 적는 것을 의미
  • 내 위치 기준에서 사용하는 경로
  • ‘/’> 가장 최상의 디렉터리로 이동(web root)
  • ./ : 파일이 현재 디렉터리를 의미
  • ../ : 상위 디렉터리로 이동
    • 두 단계 상위 디렉터리로 이동하려면 ../../ 로 사용
  • 현재 디렉터리부터 그것의 부모 혹은 하위 디렉터리, 파일을 통해 경로를 추적

파일 다운로드 취약점


파일 다운로드 취약점(File Download Vulnerability)

  • 파일 다운로드 기능 사용 시 임의의 문자나 주요 파일의 입력을 통해 웹 서버의 홈 디렉터리를 벗어나 임의의 위치에 있는 파일을 열람 혹은 다운 가능한 취약점
  • 서버에 있는 파일을 다운로드하는 기능에 대해 비정상적인 파일을 다운로드 받도록 하는 취약점
  • 경로 이동 문자를 삽입해 지정된 경로가 아닌 지정된 경로를 벗어난 경로에서 비정상적인 파일을 받게 한다.
  • 정상적인 파일 다운로드 기능과 비정상적인 파일 다운로드 기능의 기준은 정상적인 경로인지, 아니면 지정된 경로를 벗어난 경로에서 다운로드 하는 것 인지가 있다.

취약한 소스 코드 형태

  • String fileName = request.getParameter(”fileName”); → 파일명을 입력값으로 받음
  • String Filepath = request.getParameter(”filePath”); → 파일 경로를 입력값으로 받음
  • File file=new File(filePath+fileName); → 필터링 없이 경로명+파일명을 조합해 File객체 생성

취약점 진단 방법

  • 업로드 된 파일의 속성 정보를 확인해 해당 파일의 경로 노출 여부 확인
  • 사용되는 파라미터 중 변조에 의해 다른 파일에 접근이 가능한 부분이 있는지 확인
  • 파일명으로 다운로드 하는 것을 확인 후 상위 경로로 이동하는 명령어(../) 삽입
  • 다운로드한 주요 파일을 바탕으로 시스템 정보 수집

우회법

  • 파일 다운로드 경로
    • ../../../../etc/passwd
    • ../../../../etc/hosts
    • ../../../../winnt/win/ini
    • ../../../../boot.ini
    • ../../../../wp-config.php
  • 인코딩
    • ../../../../etc/passwd
    %2f%2e%2e%2f%2e%2e%2f%2e%2e%2f%65%74%63%2f%70%61%73%73%77%64  ../../../../../../../../../etc/hosts
    
    <인코딩>
    
    %2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2e%2f%65%74%63%2f%68%6f%73%74%73
    
    <더블 인코딩>
    
    %252e%252e%2f%252e%252e%2f%252e%252e%2f%252e%252e%2f%252e%252e%2fetc%2fhosts
    
  • 전자정부 표준 프레임 워크 사용
    • imageSrc.do?path=/….//….//….//….//….//….//….//….//….//….//etc/&physical=passwd
  • 그 외
    • passwd %70%61%73%73%77%64
    • 16bit 유니코드 인코딩 .(%u002e), //(%u2215), (%u2216)
    • 더블 URL 인코딩 .(%252e), /(%252f), (%255c)
    • 유닉스 ../../../../etc/passwd%0a.jpg > 개행 문자(%0a)를 삽입 가능

발생 원인

  • 파일 다운로드 시 파일의 절대 경로 혹은 상대 경로가 노출되는 경우
  • 다운로드 모듈이 파일의 경로나 이름을 파라미터로 사용하는 경우
  • 파일 경로와 파일명 필터링이 미흡해 ../를 이용해 상위 디렉터리에 접근이 가능한 경우
  • 다운로드 경로가 노출되지 않더라도 구조가 단순해 파라미터 변조를 통해 접근이 허용되지 않은 파일에 접근이 가능 할 경우

발생 원리

  • 경로 탐색 취약점(Directory Traversal)
    • 경로 탐색은 사용자가 애플리케이션의 허용된 범위를 벗어나서 서버의 다른 파일에 접근할 수 있도록 하는 취약점으로, 공격자는 이를 이용해 웹 서버의 루트 디렉터리 외부에 있는 시스템 파일을 다운로드 할 수 있음
    • 발생 원리
      • 웹 애플리케이션이 파일 경로를 사용자 입력으로 받는 경우, 적절한 검증 없이 경로를 포함한 파일을 직접 열어 다운로드하게 할 수 있음
      • 공격자가 ../../를 사용해 상위 디렉터리로 이동하면서 시스템의 민감한 파일에 접근 가능
      • /download?file=../../../etc/passwd 와 같은 방식으로 민감 파일 다운로드 시도
  • 파일 확장자 검증 실패
    • 파일 확장자가 제대로 검증되지 않으면 사용자가 의도하지 않은 파일 형식(ex : 실행 파일)을 다운로드 하거나 실행할 수 있게 된다.
    • 발생 원리
      • 웹 애플리케이션에서 다운로드 가능한 파일 형식을 제한하지 않거나 적절히 검증하지 않으면 악의적인 파일이 사용자에게 전달 될 수 있다.
      • 사용자는 애플리케이션을 신뢰해 악성 실행 파일을 다운로드하고 실행하게 될 수 있다.
  • 파일 이름 검증 실패
    • 사용자가 다운로드할 파일의 이름이 충분히 검증되지 않으면, 공격자가 악성 파일을 생성하고 이를 다운로드 하도록 유도할 수 있다.
    • 발생 원리
      • 파일 이름에 대한 검증 없이 사용자 입력을 그대로 처리하면 공격자가 악성 스크립트를 포함한 파일 이름을 이용해 파일 다운로드를 조작할 수 있다.
      • 예를 들어, image.png 대신 image.php와 같은 파일을 전달해 악성 스크립트 실행 가능
  • 인증 및 권한 관리 취약점
    • 적절한 권한 검증 없이 파일 다운로드가 이루어지면, 인증되지 않은 사용자도 중요한 데이터 파일을 다운로드 할 수 있다.
    • 발생 원리
      • 다운로드 요청이 제대로 인증되지 않거나 특정 권한이 필요함에도 불구하고 검증이 생략되는 경우, 비인가 사용자가 중요한 정보를 다운로드 할 수 있다.
      • 예를 들어, 파일을 다운로드하는 URL이 단순이 ID를 통해 접근 가능하다면, 공격자는 URL 파라미터를 조작해 다른 사용자 파일을 다운로드 할 수 있다.
  • MIME 스니핑 공격
    • 브라우저가 파일의 MIME 유형을 잘못 해석하도록 유도하면, 파일 다운로드가 아닌 실행이 될 수 있다.
    • 발생 원리
      • 서버가 파일의 MIME 유형을 잘못 지정하면 브라우저는 해당 파일을 실행 파일로 인식해 다운로드 대신 실행하려 할 수 있다.
      • 공격자는 악성 코드가 포함된 파일을 서버에 업로드한 뒤, MIME 스니핑을 유도해 피해자가 이를 실행하게 만든다.

공격 원리

  • 취약할 것으로 보이는 다운로드 모듈을 탐색
  • 사용자가 입력할 수 있는 곳(파라미터 등)에 파일명/경로 값에 상대 경로(../) 입력
  • 입력한 경로 변조를 통해 개발자가 의도하지 않은 디렉터리에 접근한 뒤 파일 다운

공격 방법

💡

운영체제 별 경로 구분 기호

  • Unix, Linux : /
  • Windows : /와 \
    - 윈도우 환경의 경우 /(슬래시)와 (역슬래시) 모두 대응해야 한다.

대응 방안

  • 전체 경로 + 파일명
    • 전체 경로와 파일명이 노출된다면 취약할 수 있는 점이 높기 때문에 로직을 변경하는 것이 좋다.
  • 일부 경로 + 파일명
    • /(슬래시) 혹은 (역슬래시), ..(두 개의 점) 이 존재할 경우에는 경고창을 출력하고 어플리케이션을 종료시키는 방법이 좋다. (치환을 통해 제거를 하게 되면 우회를 통해 공격할 수 있게 된다.)
  • 키(Key) 값
    • 이 방법은 DB에서 해당 파일에 해당하는 key값을 통해 경로를 전달 받는 방법이며, DB를 거쳐가기 때문에 퍼포먼스에 대한 단점이 존재하지만, 경로를 노출시키지 않는다는 점이 있어 다른 방법들보다 보안 측면으로 좋은 방식이다. 그렇지만, SQL Injection에는 취약하다.

잘못된 대응 방안

  • ../ 또는 ..\를 치환해 제거하게 되면, 다른 방식으로 우회가 가능하다.
<예시>

- GET /웹 서버 URL/download.php?file=?? HTTP/1.1
    - index.php는 업로드 경로의 상위 경로이며, `../`를 통해 웹 디렉터리로 이동해 접근해야 한다.
    - `../` 또는 `..\`가 치환되어 제거가 된다면 상위 경로로 이동할 수 있는 방법
        - GET /웹 서버 URL/download.php?file=…/./index.php HTTP/1.1 를 통해 `../`가 제거된 후 남아있는 `.`과 `./`가 합쳐져 `../`가 되기 때문에 상위 경로로 이동이 가능하다.
        - 즉, GET/웹 서버 URL/download.php?file=.(../)./index.php HTTP/1.1 괄호 안의 `../` 가 제거되고 `../index.php` 가 남게 되는 것이다.
        - 또는 GET /웹 서버 URL/ download.php?file=..(../)/HTTP/1.1 해당 방식으로도 `../` 의 치환을 우회할 수 있게 된다.
  • ./ 를 치환해 제거하는 방식도 우회가 가능하다. <예시>
    • .././ 가 치환되어 제거가 되며, 위와 같이 index.php를 다운로드 해야 하는 상황이라고 가정
    • GET/웹 서버 URL/download.php?file=…././/index.php HTTP/1.1로 경로 이동 문자를 삽입 할 경우
    • GET/웹 서버 URL/download.php?file=..(../).//index.php HTTP/1.1 에서 ../ 가 제거되고
    • GET/웹 서버 URL/download.php?file=..(./)/index.php HTTP/1.1 해당 경로가 되고 마지막에 ./가 제거되어
    • GET/웹 서버 URL/download.php?file=../index.php HTTP/1.1로 경로가 지정되며 상위 경로에 접근이 가능하게 된다.

Directory Traversal


Directory Traversal

  • 공격자가 응용 프로그램을 실행 중인 서버에서 임의의 파일을 읽을 수 있도록 허용하는 웹 보안 취약점이다.
  • Directory Traversal 공격을 통해 애플리케이션 코드 및 데이터, 백엔드 시스템의 자격 증명 및 중요한 파일을 읽거나 접근할 수 있고, 임의 파일에 쓰면서 데이터를 수정해 서버를 제어할 수 있다.
  • 웹 애플리케이션이 파일 또는 디렉터리 경로를 처리할 때 적절한 입력 검증을 수행하지 않아 발생하는 취약점이다.

발생 원인

  • 경로 입력값에 대한 검증 미흡
    • 웹 애플리케이션에서 파일 경로나 리소스를 지정할 때 사용자의 입력을 신뢰하거나 충분히 검증하지 않으면, 공격자가 악의적인 경로를 입력할 수 있다.
    • 예를 들어, 사용자가 특정 파일을 요청할 때 ?file=report.txt와 같은 쿼리 파라미터를 전달 받아 해당 파일을 읽도록 설계된 경우, 공격자는 ?file=../../../../etc/passwd와 같은 상대 경로를 입력해 시스템의 다른 중요한 파일에 접근할 수 있다.
  • 경로 조작(Path Traversal)
    • 공격자는 ../와 같은 디렉터리 상위 경로 이동을 의미하는 문자열을 사용해 서버의 파일 시스템을 탐색할 수 있다.
    • 서버가 이러한 입력을 적절히 필터링 하지 않으면, 공격자는 상위 디렉터리로 이동해 원래 의도된 경로를 벗어난 파일을 읽거나 수정할 수 있게 된다.
  • 상대 경로를 사용한 취약점 악용
    • 웹 애플리케이션이 경로를 상대 경로로 처리하는 경우, 공격자는 상대 경로를 수정해 애플리케이션이 다른 파일이나 디렉터리로 접근할 수 있도록 조작할 수 있다.
    • 예를 들어, /home/user/public/ 디렉터리 내의 파일만 접근할 수 있도록 제한하려는 의도였지만, ../를 사용해 /home/user/ 상위 디렉터리나 심지어 시스템의 루트 디렉터리까지 접근 가능하게 만들 수 있다.
  • 운영체제 특성 이용
    • Directory Traversal은 다양한 운영체제에서 발생할 수 있지만, 경로 구조가 운영체제마다 다르기 때문에, 공격자는 이를 이용해 다양한 파일에 접근을 시도할 수 있다.
    • 예를 들어, 유닉스 계열에서는 /etc/passwd 파일이 민감한 정보가 저장된 파일로 흔히 타깃이 되며, 윈도우 시스템에서는 C:\Windows\system32\config\SAM 과 같은 경로가 타깃이 될 수 있다.

발생 원리

  • 상대 경로 탐색(Relative Path Navigation)
    • 운영체제의 파일 시스템은 .와 ..과 같은 특수한 경로 구분자를 사용한다.
      • . 은 현재 디렉토리
      • .. 는 상위 디렉토리로 이동
    • 예를 들어, ../../와 같은 경로를 사용하면 현재 디렉터리에서 두 단계 상위 디렉터리로 이동이 가능하다.
  • 파일 경로 조작
    • Directory Traversal 공격에서 공격자는 이러한 상대 경로 구분자를 활용하여, 웹 애플리케이션이 의도한 디렉터리 바깥의 경로로 탈출할 수 있다.
    • 예를 들어, 웹 애플리케이션이 /var/www/html/uploads 디렉터리 안에 있는 파일만 사용자에게 제공하도록 설계되었다고 가정하면, 정상적인 요청은 file=report.txt와 같이 해당 디렉터리 내 파일을 참조할 것이다. 하지만 공격자는 file=../../etc/passwd와 같은 입력을 보내, 서버가 uploads 디렉터리 바깥으로 나가 /etc/passwd 파일에 접근하도록 만들 수 있다.
  • 취약한 파일 경로 결합 방식
    • 많은 웹 애플리케이션은 사용자가 요청한 파일 이름을 서버의 특정 디렉터리와 결합해 파일 경로를 생성한다.
    • 예를 들어, /var/www/html/uploads/ 라는 경로에 사용자가 입력한 파일 이름을 결합해 /var/www/html/uploads/report.txt 와 같은 전체 경로를 생성한다.
    • 하지만 이러한 결합 과정에서 경로 탐색 문자인 ../이 포함되면, 서버는 이를 정상적인 경로로 해석하고 의도치 않게 상위 디렉터리로 이동하게 된다.
  • 파일 시스템의 신뢰성
    • 웹 애플리케이션은 파일 경로를 처리할 때 운영체제의 파일 시스템을 신뢰한다. 파일 시스템은 기본적으로 경로 내에 존재하는 모든 경로 요소(../, ./ 등)를 순차적으로 처리해 해당 경로로 이동한다.
    이때, 웹 애플리케이션이 입력값을 올바르게 검증하지 않으면, 경로 탐색 문자를 포함한 입력 값이 파일 시스템에 그대로 전달되며, 서버가 파일 시스템 규칙에 따라 상위 디렉터리로 이동하게 된다.
    
  • 권한에 따른 파일 접근
    • Directory Traversal 공격이 성공하면, 공격자는 웹 애플리케이션이 실행되는 사용자 권한으로 시스템의 다른 파일에 접근할 수 있다.
    • 이때, 웹 서버의 권한에 따라 접근 가능한 파일의 범위가 결정되지만, 잘못된 설정이 있을 경우 민감한 파일에 접근할 수 있다.
    • 예를 들어, 유닉스 기반 시스템에서는 /etc/passwd, 윈도우 시스템에서는 C:\Windows\system32\config\SAM 파일과 같은 중요한 시스템 파일에 접근하 ㄹ수 있게 된다.
  • 결과적 파일 읽기 및 노출
    • 공격자가 Directory Traversal을 통해 민감한 파일에 접근하면, 이 파일의 내용을 읽어볼 수 있다. 이를 통해 비밀번호 해시, 시스템 설정 파일, 데이터 베이스 구성 파일 등 보안상 중요한 정보가 유출될 수 있다.
    • 공격자는 이러한 파일을 악용해 추가적인 공격(시스템 권한 상승이라던가 데이터 유출같은거)을 수행할 수 있다.
// 예시 코드
<?php
	$file = $_GET['file']; // 사용자가 입력한 파일 경로를 받아옴
	include("/var/www/html/uploads/" . $file); // 파일을 해당 경로에 포함
?> 

위 코드에서, 공격자는 file=../../../../etc/passwd와 같은 값을 입력함으로써 /var/www/html/uploads/ 디렉터리 외부에 위치한 /etc/passwd 파일을 읽을 수 있다.

보안 조치

  • 입력 검증 및 화이트 리스트 사용
> **화이트 리스트 검증**
> 
- 파일 경로를 처리할 때 사용자가 입력할 수 있는 파일 이름이나 미리 정의된 범위 내에서만 허용하는 방식
- 허용된 파일만 접근할 수 있도록 파일 이름을 사전에 등록하고, 그 외의 입력은 차단해야 한다.

> **경로 검증**
> 
- 입력 받은 경로에 `../`나 `..\\`와 같은 상위 디렉터리 탐색 문자가 포함되어 있는지 확인하고, 이런 문자가 포함된 경로는 거부해야 한다.

> **파일 확장자 검증**
> 
- 사용자가 업로드 하거나 접근할 수 있는 파일의 확장자를 제한함으로써 의도하지 않은 파일을 포함시키는 것을 방지할 수 있다. 예를 들어, `.txt` 또는 `.pdf` 파일만 허용하는 식이다.
  • 경로 표준화
    • 사용자가 입력한 경로를 처리하기 전에, 해당 경로를 표준화해 불필요한 상위 경로 탐색(../, ..\\)이나 특수 문자가 제거된 절대 경로로 변환하는 작업이 필요하다. 이를 통해 공격자가 경로를 조작할 수 없게 한다.
    • PHP에서는 realpath()함수를 사용해 경로를 표준화 할 수 있다. 이 함수는 파일 경로를 절대 경로로 변환하고, 중간에 포함된 상위 경로 이동 문자를 제거한다.
      $safe_path = ("/var/www/html/uploads/" . $user_input);
      if(strpos($safe_path, "/var/www/html/uploads/") !== 0_){
      	// 상위 경로 탈출을 시도했을 경우 처리
      	exit("Invalid file path.");
      }
  • 권한 설정 강화
    • 파일 시스템의 접근 권한을 엄격하게 설정해, 웹 애플리케이션이 필요한 파일이나 디렉터리 외에는 접근할 수 없도록 해야한다. 예를 들어, 웹 서버 사용자가 접근할 수 있는 디렉터리와 파일을 최소한으로 제한하는 것이다.
    • 운영체제별로 파일 권한을 설정하고, 웹 애플리케이션에서 불필요한 파일에 접근할 수 없도록 설정하는 것이 중요하다.
      • 유닉스/리눅스 : chmod, chown 명령어를 통해 파일 권한을 설정한다.
      • 윈도우 : 파일에 대한 읽기, 쓰기, 실행 권한을 제한한다.
  • 웹 서버 설정
    • 파일 접근 제한 : 웹 서버 설정을 통해 특정 파일 또는 디렉터리에 대한 직접 접근을 금지할 수 있다.
      • Apache : .htaccess 파일을 사용해 중요한 디렉터리나 파일에 대한 접근을 제한할 수 있다.
      • Nginx : location 블록을 사용해 경로를 보호할 수 있다.
    • 심볼릭 링크 차단 : 심볼록 링크(하드 링크)를 통해 파일을 우회 접근하는 공격을 막기 위해 웹 서버에서 심볼릭 링크를 사용하지 않도록 설정하는 것이 필요하다.
  • 파일 이름을 하드 코딩 또는 인코딩하기
    • 파일 경로를 사용자가 직접 입력하도록 하는 대신, 파일 이름을 하드 코딩하거나, 데이터베이스나 서버에서 관리해 파일 이름을 직접 노출하지 않도록 설계한다. 파일 경로를 직접 입력하게 하는 방식은 피해야 한다.
    • 파일 이름에 포함된 특수 문자나 위험한 문자를 안전한 형식으로 인코딩하거나 필터링해 처리한다.
  • 사용자 입력 데이터의 이스케이핑
    • 입력된 데이터를 처리할 때 경로 탐색 문자를 그대로 사용하는 것이 아니라, 이를 이스케이핑 처리함으로써 의도하지 않은 경로로의 접근을 막을 수 있다.
      • PHP에서는 basename()함수정규 표현식을 사용해 파일 이름에서 위험한 문자를 제거할 수 있다.
  • 로깅 및 모니터링
    • 파일 접근 시도와 관련된 로그를 기록하고, 의심스러운 접근 시도나 이상한 경로 접근이 발생할 경우 이를 경고하거나 알림을 보내는 시스템을 구축해 사전에 대응한다.
    • 로그 파일을 주기적으로 분석해 Directory Traversal 공격 시도를 조기에 발견할 수 있다.
  • 최신 보안 패치 적용
    • 웹 애플리케이션, 웹 서버, 운영체제에 대한 최신 보안 패치를 적용해, 이미 알려진 취약점으로 인한 공격 가능성을 최소화 해야한다. 보안 취약점은 끊임없이 발견되므로, 이를 빠르게 패치하는 것이 중요하다.

0개의 댓글