디렉터리 리스팅을 통한 정보 노출

Exposure of Information Through Directory Listing

설명

디렉터리 리스팅(Directory Listing)은 웹 서버가 특정 폴더를 요청받았을 때, 그 폴더 안에 있는 파일 목록을 그대로 보여주는 기능입니다. Go의 http.FileServer를 그대로 외부에 노출하면, 인증 없이도 해당 디렉터리 구조와 파일 이름을 쉽게 열람할 수 있습니다. 공격자는 이 기능을 악용해 config 파일, backup 파일, 임시 로그, 숨겨 두었다고 생각한 스크립트 등 의도치 않은 민감 파일을 찾아내고, 이를 이용해 추가 공격(계정 탈취, 코드 분석, 취약점 탐색 등)을 수행할 수 있습니다.

잠재적 영향

  • 민감 정보 노출: 디렉터리 구조, 파일 이름, 백업/설정 파일 등의 정보가 외부에 그대로 노출될 수 있습니다.

  • 접근 통제 우회: 직접 링크를 모르는 파일도 목록을 통해 쉽게 찾아 접근할 수 있어, 의도한 권한 통제를 우회할 수 있습니다.

  • 추가 공격 발판 제공: 노출된 소스 코드, 설정 파일 등을 분석해 SQL Injection, 인증 우회 등 다른 취약점을 찾는 데 활용될 수 있습니다.

해결 방법

  • http.FileServer를 그대로 루트 경로(/) 또는 넓은 범위에 매핑하지 말 것.

  • 반드시 필요한 경우에만 정적 파일 전용 디렉터리(예: ./public)를 만들고, 민감 파일이 없는지 확인한 후 제한된 경로에만 매핑.

  • 정적 파일은 별도 서브도메인(static.example.com) 또는 리버스 프록시/웹 서버(Nginx 등)에 맡기고, 애플리케이션 서버에서는 직접 디렉터리 리스팅을 제공하지 않기.

  • 인증이 필요한 정적 파일은 직접 파일 경로를 노출하지 말고, 애플리케이션에서 권한 체크 후 파일 내용을 스트리밍(ServeContent, ServeFile 등)하는 방식으로 전달.

  • 배포 전/CI에서 정적 디렉터리에 config, .env, .git, backup(.bak, .old), 로그 등이 포함되어 있지 않은지 점검.

취약한 코드 및 안전한 코드 예시

취약한 코드

안전한 코드

설명:

  • 취약한 코드: 취약한 코드에서는 http.FileServer(http.Dir("."))를 루트 경로("/")에 그대로 매핑했습니다. 이 경우:

  • 애플리케이션 소스 코드, 설정 파일, .env, 로그, 백업 파일 등이 같은 디렉터리에 있으면, 브라우저로 접속만 해도 목록과 파일 내용에 접근할 수 있습니다.

  • 별도의 인증이나 권한 체크 없이 디렉터리 구조와 파일 이름이 노출되어, 공격자가 민감 정보를 수집하기 쉬워집니다.

  • 안전한 코드: 안전한 코드에서는 다음과 같이 보호합니다.

  • 정적 파일 전용 디렉터리(staticDir)를 따로 두고, 그 디렉터리만 노출합니다.

  • http.FileServer 대신 직접 파일 경로를 계산하고, os.Stat으로 디렉터리인지 확인하여 디렉터리 자체에 대한 목록 제공을 막습니다.

  • isForbidden 함수를 통해 .env, config 파일, 로그/백업 파일 등 민감 파일을 차단합니다.

  • /static 경로 하위 요청에만 정적 파일을 제공하고, 그 외 경로는 일반 애플리케이션 로직으로 처리해 노출 범위를 최소화합니다. 이렇게 하면 디렉터리 리스팅으로 인한 정보 노출을 크게 줄이고, 정적 파일 제공 범위를 명확히 통제할 수 있습니다.

참조

Last updated