IT/영어 공부노트
Path Traversal 정리 본문
Path Traversal 디렉토리 순회
사용자의 입력 데이터가 적절한 검증 없이 URL/File Path에 직접적으로 사용될 경우 의도하지 않은 임의의 경로에 접근할 수 있는 취약점이다.
사용자의 입력 데이터가 URL Path에 사용될 경우 URL 구분 문자를 사용하지 못하도록 필터링 or 인코딩이 부재하다면, 의도한 경로가 아닌 타 경로로 접근해 다른 API를 호출할 수 있다.
사용자 입력 데이터가 경로로 사용되어야 한다면 URL Encoding과 같은 인코딩이 필요하다.
URL에서 해석되는 구분 문자
문자 | 의미 |
/ | Path identifier |
.. | Parent directory * /tmp/test/../1234 => /tmp/1234 |
? | Query identifier * ? 뒤는 query로 해석 |
# | Fragment identifier * # 뒤의 값은 Server로 전달되지 않음 |
& | Parameter separator * key1=value&key2=value... 형식으로 사용 |
예시
외부 웹사이트에 있는 파일과 스크립트 첨부
http://some_site.com.br/some-page?page=http://other-site.com.br/other-page.htm/malicius-code.php
예방방법
1. 입력 유효성 검사 적용: 디렉토리 순회 시퀀스나 NULL byte가 존재하는지 검증하고 제거
2. 인덱스를 통한 파일 참조: 요청에 파일경로나 파일명을 직접 요청하도록 구현하지 않고, 특정 인덱스와 파일을 매핑하여 요청시에는 인덱스를 통해 요청되도록 구현
example.com?filename=some-file.html (X)
example.com?fileidx=3 (O) # some-file.html을 3으로 인덱싱
3. 최소 권한 적용: 웹 애플리케이션을 구동하는 사용자 계정이 불필요한 시스템 디렉토리나 파일에 접근할 수 없도록 권한을 최소화
4. 서버 패치: 항상 최신 버전으로 유지
점검방법
Step1. 파일 시스템과 연결된 요청 탐색
1. 파일 업로드/다운로드 기능 점검
2. GET매개변수, URL 경로, POST Body데이터, 요청헤더 등을 통해 설정을 동적으로 로드하는 요청이 있는지 점검
- GET 매개변수: http://www.target.com/view.php?file=some-file.html
- URL 경로: http://www.target.com/download/some-file.pdf
- POST Body 데이터:
POST /getcontents HTTP/1.1
Host: www.target.com
...생략...
filename=some-file.html
- Cookie 요청 헤더를 통한 템플릿 동적 생성: Cookie: bbc_id=bcae2ff6d760458ebbee5b48df22150c; bbc_asx=1245431 ; bbc_template=some-template
3. 요청에 파일명이나 디렉토리명이 사용된 요청 찾기 (이미지파일, pdf 파일)
Step2. 디렉토리 순회 공격에 취약한지 점검
1. 의심되는 요청을 디렉토리 순회 시퀀스를 이용해 /etc/passwd 또는 win.ini 파일을 읽을 수 있는지 확인
- 리눅스: http://www.target.com/view.php?file=../../../../../etc/passwd
- 윈도우: http://www.target.com/view.php?file=../../../../../windows/win.ini
2. 파일이 읽힌다면 취약한 것, 혹시 유효성 검사를 하는 경우 위 방법은 차단될 수 있으니 필터 우회를 시도
Step 3. 유효성 검사 우회
1. 필터가 있더라도, 안전하지 않은 방식으로 구현되었다면 우회할 수 있음
문자 | URL 인코딩 | 16비트 유니코드 인코딩 |
. (닷,dot) | %2e | %u002e |
/ (슬래시) | %2f | %u2215 |
\ (백슬래시) | %5c | %u2216 |
참조
https://dreamhack.io/lecture/courses/15