Path Traversal : self-test [2]
DATE : 2023/11/5
Last updated
DATE : 2023/11/5
Last updated
이번 POST에서는 Path Traversal [2]에서 봤던 사례 중
path traversal sequence를 strip! 해버리는 경우를 재현해볼까 한다.
전체적인 페이지 구성은 Path Traversal self test과 동일하다.
images.php로 접속해 이번에는 4.jpg 이미지를 요청해봤다.
결과는 위와 같이 정상적으로 이미지가 바뀌는 걸 볼 수 있었고 이때의 packet을 보면
<img> tag의 값이 ./images/4.jpg인 걸 보아 사용자가 요청한 이미지는
페이지와 동일한 경로가 아닌 /images directory에서 꺼내온다는 걸 알 수 있다.
따라서 우리의 목표인 hanhxx directory - secret.txt를 읽기 위해서는
기본적으로 설정된 /images directory 경로에서 한 번 빠져나오도록 해야 한다.
directory를 빠져나오기 위해 path traversal sequence를 사용하면..!
페이지 상에는 alt 값이 출력 되고
(사용자가 입력한 경로와 일치하는 이미지 파일이 없기 때문에)
packet에서도 404 Not Found 라고 한다. 흠 🧐
Path Traversal self test에서는 이렇게 해서 분명 directory 이동에 성공했는데..
문제가 있는 듯하다!!
self-test [1]과 비교해봤을 때, PHP code가 추가되었다.
이번에 구현한 환경은 기본적으로 sequence ../ 를 차단하기 위해서
"../"를 발견하면 공백으로 교체해버리는 내용을 추가했다.
그렇다 보니 위에서 입력한 값이 $filename으로 전달되면
이와 같은 과정으로 sequence가 제거 되는 것이다..!
하.지.만 sequence를 제거함으로써 만들어지는 sequence는 어떻게 막지 못한다!!
와 같이 값을 입력하게 되면
함수를 거친 결괏값에 sequence가 포함 되므로
str_replace 과정을 거친 값이 filename으로 들어가게 되면
<img> 경로 값에 위와 같이 "../"이 남아있게 된다.
해당 경로의 이미지를 가져오기 위해 /images/../hanhxx/secret.txt 경로의 파일을 요청하게 되면
response에서 secret.txt 파일 내용을 확인할 수 있게 된다!!
이렇게 해서 우회 성공! 😄
직접 구현한 예시를 통해서
일차적으로 sequence만 제거하려고 하다 보면 생각보다 쉽게 우회될 수 있음을 알게 되었다.
sequence를 제거하는 과정 후에도 nested sequence와 같이
path traversal sequence가 존재하는 지 확인하거나 애초에 sequence가 감지되면
그 이후의 어떠한 script도 실행되지 않도록 중단해버리는 등 추가적인 보완이 필요할 듯하다. 😫😫