디렉토리 트래버설
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)한 뒤에 허용 디렉토리 하위인지 다시 검사한다. 정규화 전에 검사하면 인코딩으로 우회된다.
- 웹 서버 프로세스 권한을 최소화하고 상위 디렉토리 접근을 막는다.
- 디렉토리 리스팅은 기본 문서가 없을 때 디렉토리 안의 파일 목록이 그대로 보이는 서버 설정 문제다.
- 디렉토리 트래버설은 경로 자체를 조작해 다른 디렉토리로 빠져나가는 입력값 검증 문제다.
