본 내용 및 실습 환경은 KISEC, 케이쉴드 주니어 교육 과정에 있음을 알려드립니다.

파일 다운로드 취약점

파일 다운로드 기능이 존재하는 웹에서 파일 다운로드 시 파일의 경로 및 파일명을 파라미터로 받아 처리하는 경우 이를 적절히 필터링 하지 않으면 공격자가 이를 조작하여 허용되지 않은 파일을 다운 받을 수 있고 임의의 위치에 있는 파일을 열람하거나 다운받는 것이 가능해지는 취약점이다.

위 그림으로 설명드리면 정상적으로 해당 웹에서 파일 다운로드 받을 수 있는 항목으로는 운동화.png, 북한산풍경.png 이러한 것이 될 것이다.

하지만, 파일 다운로드 받을 때 생기는 URL을 임의로 수정하여 /etc/passwd, /etc/shadow와 같은 중요 파일을 다운로드를 받을 수 있는 것이다.

실습 개요

웹에서 파일 다운로드 기능을 지원해준다는 가정하에 진행하겠습니다.

파일 다운로드 받을 때의 링크는 http://10.200.43.12/kisec/dataRoom/kisec_lab_view.html와 같다.

파일 다운로드에 대한 소스 코드를 보면 ../../ 하위 디렉토리로 이동한다.

다운로드 링크에서 하위 디렉토리 두번을 하면 http://10.200.43.12/ 홈 디렉토리가 된다. 여기서 /_core/ 로 이동하고 _download.php를 이용하는 것을 알 수 있다.

  • file_url=lab
    • 현재 /_core/ 에서 lab이라는 디렉토리 들어간다.
  • album_5f8ff99f40d13.txt
    • 서버에서 존재하는 album_5f8ff99f40d13.txt 파일을 다운로드 받는다.
  • real_name=test.txt
    • 이용자가 다운로드 받을 때 받아지는 파일의 이름 명시해준다.

file_urlalbum_5f8ff99f40d13.txt를 변경하면 즉, 파일 경로와 파일명을 변경하면 우리가 원하는 파일을 가져 올 수 있다는 것이다.

Burp Suite 활용

파일을 다운로드 받기 전 Proxy로 넘기는 것을 잡겠습니다.

우리가 위에서 알아본 링크와 같은 내용의 페이로드다. Repeater로 넘겨 /etc/passwd를 가져오기 위한 대입을 해보겠습니다.

첨부파일이 존재하지 않습니다.의 Alert를 띄운 것을 보니 경로 지정이 잘못 되었다는 것을 알 수 있다.

  • 현재 위치 : http://10.200.43.12/_core/etc/
    • /etc/ 디렉토리는 최상위 디렉토리에 존재한다. ../를 추가해보면서 하면 아래와 같은 결과가 나온다.

총 다섯 번의 하위 디렉토리 이동을 진행하면 최상위 디렉토리를 들어갈 수 있음을 알 수 있다.

  • 결과 : /var/www/10.200.43.12/_core/lab
    • 다섯 번의 이동이라면 해당 웹은 Apache2를 사용하고 URL을 보면 html을 주 사용하므로 결과와 같은 경로로 지정 되어 있음을 유추할 수 있다.

Tip.
최상위 디렉토리의 접근은 하위 디렉토리를 몇 번을 진행해도 에러가 발생하지 않는다.
../../../ 를 10번을 쳐도 100번을 쳐도 계속 최상위 디렉토리에 있기에 최상위 디렉토리를 접근하는 것이 목적이라면 한 번에 치는 것이 권장한다.

이렇게 임의의 경로로 변경하여 허용되지 않은 파일을 열람 및 다운로드를 받을 수 있는 취약점에 대해 알아봤다.

대응 방안

  • 시퀀스 사용
    • 시퀀스 넘버를 통해 파일을 다운로드 하도록 구성하면, 직접적으로 경로를 조작 할 수 없으므로 다운로드 공격을 예방 할 수 있습니다.참고 자료
  • 다운로드 디렉토리 한정
    • 시스템에 존재하는 임의의 파일을 다운로드 받지 못하도록 제한합니다.
  • 문자열 필터링
    • 상위 디록토리에 해당하는 ../ 등을 필터링 해야합니다.
    • 외부에서 입력하는 파일 경로와 이름에 대해 허용하는 경로 이외의 디렉터리와 파일에 접근할 수 없도록 처리한다.
    • 외부 입력값에 대해 파일 경로를 변경할 수 있는 문자열에 대해 필터링한다.
    • php로 개발된 경우 php.ini의 내용 중 magic_quotes_gpc 항목을 on으로 설정하여 .\와 ./ 입력 시 치환되도록 설정한다.