[web]Directory traversal

zzsla·2023년 7월 10일
0
post-custom-banner

Directory traversal이란

디렉토리 탐색(파일 경로 탐색)은 공격자가 application을 실행 중인 서버에서 임의의 파일을 읽을 수 있도록 허용하는 웹 보안 취약점이다. 여기에는 application 코드나 데이터, 백엔드 시스템의 자격 증명이나 중요한 운영 체제 파일이 포함된다. 경우에 따라 공격자는 서버의 임의 파일을 쓸 수 있으므로 application 데이터 또는 동작을 수정할 수 있고, 최종적으론 서버를 완전히 제어할 수 있다.

Directory traversal을 통해 임의 파일 찾기

판매할 항목의 이미지를 표시하는 쇼핑 application을 생각해 보면 이미지는 다음과 같은 HTML을 통해 로드가 된다.

<img src="/loadImage?filename=218.png">

loadImageURL은 filename파라미터를 사용하고, 지정된 파일 내용을 반환한다. 이미지 파일은 디스크 /var/www/images/위치에 저장된다. 이미지를 반환하기 위해 application은 요청된 파일 이름을 기본 디렉토리에 추가하고 파일 시스템 API를 사용하여 파일 내용을 읽는다. 위 경우 application은 다음 파일 경로에서 읽는다.

/var/www/images/218.png

application에서는 파일 탐색 공격을 방어하는 것을 구현하지 않으면, 공격자는 다음 URL을 요청하여 서버의 파일 시스템에서 파일을 검색할 수 있다.

/var/www/images/../../../etc/passwd

../시퀀스는 파일 경로에서 동작하며 디렉토리 구조에서 한 단계 위로 올라간다는 의미이다. 3개 연속으로 쓴 ../시퀀스는 /var/www/images/에서 파일 시스템 루트로 올라가므로 실제 읽히는 파일은 다음과 같다.

/etc/passwd

Window에서 ../..\ 둘 다 유효한 디렉토리 탐색 시퀀스이며 운영체제 파일을 검색하는 공격은 다음과 같다.

https://insecure-website.com/loadImage?filename=..\..\..\windows\win.ini

Directory traversal 취약점 악용에 대한 장애물

사용자 입력이 파일 경로에 배치하는 application은 디렉토리 탐색 공격에 대한 방어 기능을 구현한다. 하지만 이러한 방어 기능들을 종종 우회될 수 있다.
filename=/etc/passwd와 같이 파일 시스템 루트, 절대경로를 사용해서 디렉토리 탐색 시퀀스를 사용하지 않고 파일을 직접 조회할 수 있다.

중첩된 디렉토리 탐색 시퀀스인 ....// 또는 ....\/ 등을 사용할 수 있다. 이것은 내부에서 시퀀스를 삭제한다면 다시 다시 원래 디렉토리 탐색 시퀀스로 돌아간다.

몇몇 경우는 URL 경로나 multipart/form-data 요청 파일이름 파라미터 등에서 웹 서버가 입력을 application에 전달하기 전에 디렉토리 탐색 시퀀스를 삭제할 수 있다. 이러한 필터링을 우회하기 위해 ../를 URL 인코딩을 하거나 URL 인코딩을 두 번 사용해서 우회할 수 있다. 그래서 ../%2e%2e%2f이나 %252e%252e%252f와 같은 값이 된다. 또 ..%c0%af이나 ..%ef%bc%8f이와 같은 다양한 비표준 인코딩도 동작할 수 있다.

application에서 사용자 제공 파일이 기본폴더(예:/var/www/images)에서 시작해야 한다고 할 경우 필요한 기본 폴더와 디렉토리 탐색 시퀀스를 넣을 수 있다.예를 들어 다음과 같이 사용할 수 있다.

filename=/var/www/images/../../../etc/passwd

만약 application이 사용자가 제공한 파일 이름이 특정 파일 확장자로 끝나야 한다면(.png) 널바이트(%00)를 이용해서 필요한 확장자 이전에 파일 경로를 종료시킬 수 있다. 예를 들어 다음과 같이 사용할 수 있다.

filename=../../../etc/passwd%00.png
profile
[README]newbi security hacker :p
post-custom-banner

0개의 댓글