디렉토리 트래버설

IT 위키
Directory Traversal; Path Traversal; 경로 조작
외부 입력값이 파일 경로에 그대로 쓰일 때, 상위 디렉토리로 이동하는 문자열을 넣어 공개 범위 밖의 파일에 접근하는 공격
  • 웹 문서 루트를 벗어나 /etc/passwd, 설정 파일, 소스 코드, 백업 파일 등을 읽어 낸다.
  • 읽기에 그치지 않고 덮어쓰기까지 가능하면 원격 코드 실행으로 이어진다.

공격에 쓰이는 문자열

[편집 | 원본 편집]
구분 문자열
기본 ../ , ..\
URL 인코딩 %2e%2e%2f , %2e%2e/
이중 인코딩 %252e%252e%252f
유니코드 우회 ..%c0%af , ..%c1%9c
널 바이트 ../../etc/passwd%00.jpg
  • 핵심은 경로 구분자(/, \)와 상위 이동(..) 이다. 그래서 입력값 필터링에서 가장 먼저 걸러야 할 특수문자가 / 이다.

취약한 예

[편집 | 원본 편집]
http://example.com/download.php?file=../../../../etc/passwd
  • 내려받을 파일명을 검증 없이 경로에 이어 붙이면 위 요청이 그대로 통한다.
  • 외부 입력값에서 / , \ , .. , %00 같은 경로 이동 문자를 제거하거나 거부한다.
  • 파일명만 받고 디렉토리는 서버가 정한다. 경로 전체를 사용자에게 받지 않는다.
  • 내려받을 수 있는 파일을 허용 목록으로 한정한다.
  • 경로를 정규화(canonicalization)한 뒤에 허용 디렉토리 하위인지 다시 검사한다. 정규화 전에 검사하면 인코딩으로 우회된다.
  • 웹 서버 프로세스 권한을 최소화하고 상위 디렉토리 접근을 막는다.

디렉토리 리스팅과의 차이

[편집 | 원본 편집]
  • 디렉토리 리스팅은 기본 문서가 없을 때 디렉토리 안의 파일 목록이 그대로 보이는 서버 설정 문제다.
  • 디렉토리 트래버설은 경로 자체를 조작해 다른 디렉토리로 빠져나가는 입력값 검증 문제다.

같이 보기

[편집 | 원본 편집]