Path Traversal [2]
DATE : 2023/10/29
Last updated
DATE : 2023/10/29
Last updated
앞선 Path Traversal [1]에서 살펴본 내용은 Path traversal이 무엇인지,
아무런 조치도 취하지 않은 경우 traversal sequence가 어떤 결과를 가져오는 지에 대해
간단하게 살펴보았다.
이번에 살펴볼 내용은 traversal sequence를 차단하기 위한 어떤 과정이 추가되었지만
이를 우회하여 원하는 결과(/etc/passwd)를 얻을 수 있음을 확인해보고자 한다.
첫 번째로 살펴볼 Lab은 traversal sequence를 strip 해버린다고 한다.
여기서 strip은 없애고자 하는 값을 발견했을 때 제거한다는 의미로 보면 된다.
마음에 드는 상품 하나를 골라서 클릭하면 총 2개의 packet이 지나가는 걸 볼 수 있는데
첫 번째 packet은 productID parameter를 보내는 Get request이고
두 번째 packet은 filename parameter로 사용할 이미지 파일명을 보낸다.
여기서 우리는 두 번째 packet을 활용할 것이다.
이전 LAB에서 했던 것처럼
parameter 값을 넣어보면
아마 원하는 결과가 나오지 않을 것이다.
이번 LAB에서는 공격자가 sequence를 사용하지 못하도록 " ../ "를 제거한다고 했다.
그렇다면 이를 어떻게 우회해 /etc/passwd에 접근할 수 있을까??
단순하게 생각해봤을 때, 우리는 " ../ " 를 이용해야 하고 서버에서는 " ../ "를 제거한다.
그러면 서버가 " ../ " sequence를 제거했을 때의 결과가 " ../ " sequence가 되도록 하면 되지 않을까?
traversal sequence를 또 다른 sequence가 감싸는 형태로 입력하게 되면
서버에서는 감싸져 있는 내부 sequence만 제거하게 되고
내부 sequence가 제거되면서 외부에 작성된 값이 서로 이어 붙여지면
새로운 sequence가 만들어지게 되는 것!!
이를 이용해 /etc/passwd에 접근을 시도해보면
성공적으로 파일 내용을 얻을 수 있다.
이번에는 또 다른 LAB을 살펴보고자 한다.
앞에서는 sequence ../ 를 제거했다면 이번엔 URL decoding을 실행한다고 한다.
똑같이 packet을 잡아
를 입력해보면 "No such file" 응답이 돌아온다.
그렇다면 문제에 귀띔해 준 대로 URL decoding 과정에서 살아남기 위해 URL encoding을 해보자.
위와 같이 sequence 대신 URL encoding 한 값을 넣어주면
결과 안 나온다. (?)
흠 혹시 모르니 encoding을 한 번 더 해보자.
URL encode를 두 번 실행한 값을 넣으면 성공적으로 /etc/passwd 를 얻을 수 있다!!
(+) encode & decode 값 손쉽게 확인하기
입력 파라미터 값을 쭉- 드래그 해보면
sequence ../ 를 한 번 encoding 한 값, 두 번 encoding 한 값에 대해
decode 된 결과를 쉽게 확인할 수 있다.
이렇게 해서 path traversal sequence를 차단하기 위해
(1) sequence strip하기
(2) URL decoding 과정을 거쳐 파라미터 값 사용하기
와 같은 경우를 살펴보았다.
이에 대해 우리는
(1) 외부에서 sequence를 감싸는 sequence 사용하기
(2) URL encoding 과정을 거쳐 parameter 조작하기
를 통해 LAB을 풀 수 있었다.
이 과정을 통해서 sequence를 차단하기 위한 과정이 충분하지 못하다면
손쉽게 우회 될 수 있음을 인지하고 넘어가야 한다!!