syurhia 님의 블로그
1. File path traversal, simple case 본문
유저의 요청에 디렉터리 입력이 있을 때, 웹 서버의 파일 디렉토리에 접근이 가능한 path traversal(경로 조작)에 대해 알아보자.
백엔드로 파일 처리 함수로 들어가는 값을 적절히 처리하지 못하면 발생할 수 있는 취약점이다(보통 웹서버로 요청이 들어오면 그 요청 값을 파일처리 함수로 보내야 실제 파일을 받을 수 있으니까).
보통의 유저는 요청값을 변조하지 않기에 서버가 지정해준 파일만 열게 되겠지만, 공격자의 경우에는 서버에 보낼 요청값을 바꿔서 다른 파일을 불러오는 방식으로 공격이 이루어진다.
예를 들면 웹 사이트에서 흔히 볼 수 있는 파일을 보여주는 태그로써 <img src="">와 같은 이미지 태그가 있지 않은가?
이 기능을 통해서도 서버의 설정파일들을 보내달라고 요청할 수도 있는 것이다.
대략적인 설명은 했으니 문제에 대한 풀이로 들어가겠다.
그림1과 같은 path traversal취약점이 있는 사이트가 있다. 목적은 이 웹사이트를 제공하는 웹서버의 etc디렉터리의 passwd 설정파일을 불러오는 것이다.
힌트로는 이미지에 취약점이 있다고 한다.
passwd를 불러오는 이유는 간단하다. passwd를 불러오면 서버에 로그인 가능한 아이디(사용자)들 목록도 알 수 있고, 백엔드 서비스(apache, docker, mysql...)들도 파악이 가능하기 때문에 그 서버에 대한 정보를 알아보기 위해서도 passwd를 읽어보고자 하는 것이다. 참고로 passwd는 -rw-r--r--의 권한이므로 모두가 이 파일에 대해 읽을 권한이 있다.

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

그림 2를 보면 알다 시피 개새? 그림과 설명이 적혀있다.
이것만으로는 정보가 부족하니 그림 2의 페이지의 코드를 한 번 살펴보자.
우클릭하고 페이지 소스 보기를 누른다.

코드를 보면 그림 3의 빨간 동그라미 부분을 잘 보도록 하자.
아래의 <img src="/image?filename=25.jpg">라는 태그가 있다.
이 태그를 보면 image라는 프로그램에 filename이라는 변수값으로써 25.jpg를 보내는 것이다(물론 GET 방식).
그에 대한 반환 값로서 그림 2의 개새 이미지가 등장한거다.
일단 저 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를 불러왔다. 이미지가 깨진것처럼 나와있지만 파일은 확실히 불러와졌다.
아니라면 깨진파일이 아니라 에러가 떴던가 무언가가 떴을 것이다.
그러면 저 파일이 제대로 내용물을 불러온건지 확인해보자.
크롬의 개발자도구에서 Network부분을 보면 통신 내역을 볼 수 있다.

그림 6과 같이 내가 요청한 /etc/passwd가 응답으로써 나에게 제대로 도달했는지 확인이 가능하다.
root:x:0:0:root:/root:/bin/bash......이렇게 있는 걸 보아하니 제대로 왔다.
클리어!
'보안관련 > PortSwigger' 카테고리의 다른 글
| 3. File path traversal,traversal sequences stripped non-recursively (0) | 2026.05.29 |
|---|---|
| 2. File path traversal,traversal sequences blocked with absolute path bypass (0) | 2026.05.29 |
| SQL injection을 예방해보자 (0) | 2026.05.07 |
| Second-order SQL injection (0) | 2026.05.07 |
| SQL injection with filter bypass via XML encoding (0) | 2026.05.07 |