R's Hacking Daily Log

Directory Traversal 본문

Port Swigger/Directory Traversal

Directory Traversal

hanhxx 2022. 11. 2. 16:05

https://portswigger.net/web-security/images/directory-traversal.svg

Directory Traversal이란? 

file path traversal이라고도 불리는,

공격자가 application에서 돌아가는 서버의 임의 파일을 읽을 수 있도록 하는 웹 보안 취약점이다. 

 

application의 code와 data, back-end system에 대한 자격, 중요한 운영 시스템 파일들이 대상이 될 수 있으며,

경우에 따라 공격자가 다음의 것을 할 수 있게 된다. 

  1. 서버의 임의 파일을 작성
  2. 어플리케이션의 데이터나 동작을 수정
  3. 서버의 전체 통제권을 Get!

 


 

Reading arbitrary files via directory traversal

세일을 하는 상품의 이미지들을 띄우는 쇼핑 어플리케이션이 있다고 가정해보자!

여기서 상품의 이미지는 아래와 같이 HTML의 image tag를 사용하여 업로드될 수 있다. 

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

//loadImage가 뭐야?
//filename이 79.png인 파일이야

loadImage URL은 filename이라는 매개변수를 가지며, 지정된 파일의 내용을 반환하고

image file은 알아서 disk 속 /var/www/images/ 경로에 저장된다.

 

image를 반환할 때는 어플리케이션이 filesystem API로 해당 파일의 내용을 읽기 위해

filename의 값을 기본 경로 뒤에 이어 붙여 사용한다. 이때 파일의 path는 아래와 같다.

/var/www/images/79.png

 

 

여기서의 어플리케이션은 directory traversal 공격에 대한 방어를 실행하지 않기 때문에,

공격자는 서버의 파일 시스템으로부터 임의의 파일을 검색하기 위한 URL을 요청할 수 있다. 

https://insecure-website.com/loadImage?filename=../../../etc/passwd

 

이 URL은 어플리케이션이 

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

위와 같은 경로의 파일을 읽도록 만든다. 

따라서 매개변수 값에 공격자가 원하는 파일의 경로를 입력하여 의도와 다른 정보를 얻을 수 있게 되는 것이다.

 

위의 path에서 사용된 [ ../  ] 는 file path에서 유효한 sequence로, 폴더 구조에서 한 단계 더 들어간다는 의미이다. 

3번 연속적인 ../ sequence는 /var/www/images/ 에서 filesystem root로 이동하는 것을 의미하여 사실상 읽어진 파일은 

/etc/passwd

 

/etc/passwd 파일은 Unix 기반 운영 시스템에서는 서버에 등록된 사용자의 세부 사항을 포함하는 표준 파일이다.

 

 

Window 기반에서는 [ ../ 과 ..\ ] 모두 directory traversal의 유효한 sequence로 표준 운영 시스템 파일을 검색하기 위한 공격으로서

동일한 기능을 한다. 

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

 


 

Commom obstackles to exploiting file path traversal vulnerabilities

file path에 사용자의 input이 들어가는 어플리케이션은 path traversal 공격에 대한 몇 가지 방어를 실행한다.

 

!) 이제부터 어플리케이션이 사용자가 input으로 제공한 filename으로부터 directory traversal sequence를

제거하거나 차단하는 경우를 살펴보자

 

 

1) Absolute path

filename=/etc/passwd

 

와 같은 절대 경로를 사용할 수 있다면, 어떤 sequence를 사용하지 않고 file을 곧바로 참조

 

 

2) Nested Traversal Sequence

....// or ....\/

내부 sequence를 제거할 때, 단순한 traversal sequence로 되돌아가는 중첩된 traversal sequence 사용

 

 

3) Sequence Encoding

웹 서버는 어플리케이션에 사용자의 입력값을 보내기 전에, 어떤 directory traversal sequence든 제거할 것이다.

이런 경우에는, URL은 encoding or double encoding 함으로써 우회할 수 있을지도 모른다. 

../ : %2e%2e%2f or %252e%252e%252f
non-standard encoding : ..%c0%af or ..%ef%bc%8f

 

 

4) suitable traversal sequences

어플리케이션이 filename의 값이 반드시 base folder로 시작하도록 요구한다면,

요구된 base folder를 포함하며 적절하게 sequence를 사용할 수 있다. (ex. base folder = /var/www/images/)

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

 

 

5) Null byte 

어플리케이션이 filename의 값을 반드시 예상되는 파일 확장자가 되도록 요구한다면,

요구된 파일 확장자 전, 파일 경로를 끝낼 때 Null byte를 사용할 수 있다. (ex. expected file extension = png)

filename=../../../etc/passwd%00.png

 

 

'Port Swigger > Directory Traversal' 카테고리의 다른 글

Directory Traversal - Lab(2)  (0) 2023.05.19
Directory Traversal - Lab(1)  (0) 2023.05.19
Directory Traversal (2)  (0) 2023.05.18
Directory Traversal (Path Traversal) (1)  (0) 2023.05.17
Directory Traversal Lab  (0) 2022.11.06
Comments