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 값이 출력 되고
(사용자가 입력한 경로와 일치하는 이미지 파일이 없기 때문에)
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가 감지되면
packet에서도 404 Not Found 라고 한다. 흠
이렇게 해서 우회 성공!
그 이후의 어떠한 script도 실행되지 않도록 중단해버리는 등 추가적인 보완이 필요할 듯하다.