syurhia 님의 블로그

1. File path traversal, simple case 본문

보안관련/PortSwigger

1. File path traversal, simple case

syurhia 2026. 5. 29. 21:18

유저의 요청에 디렉터리 입력이 있을 때, 웹 서버의 파일 디렉토리에 접근이 가능한 path traversal(경로 조작)에 대해 알아보자.

 

백엔드로 파일 처리 함수로 들어가는 값을 적절히 처리하지 못하면 발생할 수 있는 취약점이다(보통 웹서버로 요청이 들어오면 그 요청 값을 파일처리 함수로 보내야 실제 파일을 받을 수 있으니까).

 

보통의 유저는 요청값을 변조하지 않기에 서버가 지정해준 파일만 열게 되겠지만, 공격자의 경우에는 서버에 보낼 요청값을 바꿔서 다른 파일을 불러오는 방식으로 공격이 이루어진다.

 

예를 들면 웹 사이트에서 흔히 볼 수 있는 파일을 보여주는 태그로써 <img src="">와 같은 이미지 태그가 있지 않은가? 

이 기능을 통해서도 서버의 설정파일들을 보내달라고 요청할 수도 있는 것이다.

 

대략적인 설명은 했으니 문제에 대한 풀이로 들어가겠다.

 

그림1과 같은 path traversal취약점이 있는 사이트가 있다. 목적은 이 웹사이트를 제공하는 웹서버의 etc디렉터리의 passwd 설정파일을 불러오는 것이다. 

힌트로는 이미지에 취약점이 있다고 한다.

passwd를 불러오는 이유는 간단하다. passwd를 불러오면 서버에 로그인 가능한 아이디(사용자)들 목록도 알 수 있고, 백엔드 서비스(apache, docker, mysql...)들도 파악이 가능하기 때문에 그 서버에 대한 정보를 알아보기 위해서도 passwd를 읽어보고자 하는 것이다. 참고로 passwd는 -rw-r--r--의 권한이므로 모두가 이 파일에 대해 읽을 권한이 있다.

그림 1. path traversal취약점이 있는 웹사이트

 

그러면 한 번 The Lazy Dog라는 페이지의 details을 보러 가보자.

View details를 눌러준다.

 

그림 2. The lazy dog 표면

그림 2를 보면 알다 시피 개새? 그림과 설명이 적혀있다.

이것만으로는 정보가 부족하니 그림 2의 페이지의 코드를 한 번 살펴보자.

우클릭하고 페이지 소스 보기를 누른다.

 

그림 3. 취약점이 있는 코드

코드를 보면 그림 3의 빨간 동그라미 부분을 잘 보도록 하자.

아래의 <img src="/image?filename=25.jpg">라는 태그가 있다.

이 태그를 보면 image라는 프로그램에 filename이라는 변수값으로써 25.jpg를 보내는 것이다(물론 GET 방식).

그에 대한 반환 값로서 그림 2의 개새 이미지가 등장한거다.

 

일단 저 image라는 프로그램만 따로 실행을 해보자.

그림 4. image프로그램 실행

그림 4와 같이 이미지만 반환되는 게 확인이 가능하다.

filename이 변수값이니 여기에 path traversal을 발생시켜 /etc/passwd를 받아야 한다.

 

생각을 해보자.

일단 이 image라는 프로그램이 어느 디렉터리에 존재할 지는 모르겠지만, 웹서버에 포함시켰다고 추측한다면 보통 /var/www/html이나 /var/www/ 즈음에 저장이 되어있을 것이다.

/var/www/html에 존재한다면 filename = ../../../etc/passwd를 쓰면된다.

만약 /var/www에 존재한다면 filename = ../../etc/passwd를 쓰면된다.

 

그러면 두 번이나 시도해야 할까?

 

물론 아니다.

 

리눅스는 최상위 디렉터리인 루트에 도달하면 ../를 몇 번이고 반복해서 입력해도 최상위 디렉터리에 그냥 고정이 된다.

즉 결론으로는 ../를 그냥 많이 쓰면 된다이다.

 

filename = ../../../../../../../../../../../../../../../etc/passwd를 써도 된다는 것이다. 그리고 위에 쓴 것처럼 ../를 몇 개 쓸 지 고민하는 것보단 이게 속편하기도 하다.

 

그림 5. /etc/passwd를 불러온 화면

그림 5와 같이 ../를 여러번 쓰고 /etc/passwd를 불러왔다. 이미지가 깨진것처럼 나와있지만 파일은 확실히 불러와졌다.

아니라면 깨진파일이 아니라 에러가 떴던가 무언가가 떴을 것이다.

그러면 저 파일이 제대로 내용물을 불러온건지 확인해보자.

 

크롬의 개발자도구에서 Network부분을 보면 통신 내역을 볼 수 있다.

그림 6. 통신 내역

그림 6과 같이 내가 요청한 /etc/passwd가 응답으로써 나에게 제대로 도달했는지 확인이 가능하다.

root:x:0:0:root:/root:/bin/bash......이렇게 있는 걸 보아하니 제대로 왔다.

 

클리어!