파일 다운로드 취약점

보안노트·2024년 4월 30일
0

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


  • 서버에 있는 파일을 다운로드하는 기능에 대해서 비정상적인 파일을 다운로드 받도록 하는 취약점이다.

  • 경로 이동 문자를 삽입해서 지정된 경로가 아닌 지정된 경로를 벗어난 경로에서 비정상적인 파일을 받게 한다.

  • 정상적인 파일 다운로드 기능과 비정상적인 파일 다운로드 기능의 기준은 정상적인 경로인지, 아니면 지정된 경로를 벗어난 경로에서 다운로드하는 것인지가 있다.




공격 방법


  • CASE 1 : 파일명만 입력 받기 때문에 filename에 경로 이동 문자를 삽입하여 지정된 경로를 벗어날 수 있다.

  • CASE 2 : 일부 경로와 파일명을 입력받는 케이스이며 해당 케이스는 공격 방법이 두 가지이다.
    일부 경로를 받는 곳에 경로 이동 문자를 삽입하거나, 파일명에 경로 이동 문자를 삽입할 수 있다.

  • CASE 3 : 전체 풀 경로가 나오는 케이스이며 /etc 경로를 삽입하여 공격할 수 있는 가장 취약한 케이스이다.

운영 체제별 경로 구분 기호

  • Unix, Linux : /

  • Windows : /\

  • 윈도우 환경의 경우 /(슬래시)와 (역 슬래시) 모두 대응해야 한다.




파일 경로 - 절대 경로, 상대 경로


  • 절대 경로 : 파일의 root부터 해당 파일까지의 전체 경로를 의미한다.

  • 상대 경로 : 현재 파일의 위치를 기준으로 연결하려는 파일의 상대적인 경로를 적는 것을 의미한다.

  • / : root를 의미

  • ./ : 현재 위치를 의미

  • ../ : 상위 경로




실습 - Burp Suite 활용


  • 버프 스위트의 프록시 기능을 통해서 경로 이동 문자를 삽입하려는 과정이며
    해당 서버가 windows 환경인지 판별하기 위해 /(슬래시)와 (역 슬래시)를 통해 응답 값을 확인하는 과정.


  • 파일 경로에 ./를 삽입하였을 경우에는 파일이 다운로드 되지만 ../를 삽입하였을 경우 파일이 다운로드 되지 않았다.
    이로 인해 상위 경로로 올라갈 경우 웹 디렉터리라고 판단할 수 있다.


  • ../의 경로가 웹 디렉터리라는 것을 파악 후, 상위 경로로 이동 후에 대표적인 index.php를 다운로드 할 수 있게 된다.




대응 방안


1. 전체 경로 + 파일명

  • 전체 경로와 파일명이 노출된다면 취약할 수 있는 점이 높기 때문에 대응 방안 2번~4번의 로직으로 변경하는 것이 좋다.

2. 일부 경로 + 파일명

  • /(슬래시) 또는 \(역슬래시), ..(두 개의 점)이 존재할 경우에는 경고창을 출력하고 어플리케이션을 종료시키는 방법이 좋다. (치환을 통해 제거를 하게 되면 우회를 통해 공격할 수 있게 된다.)

3. 파일명

  • 파일명 파라미터에 대해서 /(슬래시) 또는 \(역슬래시), ..(두 개의 점)이 존재할 경우 경고창 출력 및 어플리케이션을 종료시키는 방법이 좋다.

4. 키(Key) 값

  • 해당 방법은 DB에서 해당 파일에 해당하는 key 값을 통해 경로를 전달받는 방법이며, DB를 거쳐 가기 때문에 퍼포먼스에 대한 단점이 존재하지만, 경로를 노출시키지 않는다는 점이 있어 다른 방법들보다 보안 측면으로 좋은 방식이다. 그렇지만 SQL 인젝션에 취약하다는 점이 있다.




잘못된 대응 방안


  • ../ 또는 ..\를 치환하여 제거하게 된다면 다른 방식으로 우회가 가능하다는 점이 있다.

    • 예시) 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로도 가능하다.

      즉, 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로 경로가 지정되며 상위 경로에 접근이 가능하게 된다.

0개의 댓글

관련 채용 정보