Path Traversal : self-test [1]
DATE : 2023/10/25
Last updated
DATE : 2023/10/25
Last updated
Path Traversal [1]에서 살펴본 Lab과 유사한 환경을 직접 만들어보고
path traversal sequence가 과연 유효할 것인지..! 직접 확인해보자.
Lab과 비슷하게 만들어볼 환경은 image choice form이다.
images directory에 총 4개의 이미지를 가지고 있는 상태에서
사용자가 이미지의 이름을 입력하면 해당 이미지를 출력하는 간단한 form을 만들어볼까 한다.
( 사용자가 이미지를 선택하지 않은 상태일 때는 기본적으로 1.jpg를 출력하도록 했다. )
image choice form을 제공할 코드는 위와 같다.
html에서는 간단하게 이미지 이름을 받을 <input> & 제출 버튼 역할의 <input> tag를 구성하고 있다.
PHP에서는 KEY 'submit'이 글로벌 변수 GET에 존재하는 지 확인한다.
(<form> tag에서 method 속성을 get을 지정했기 때문에)
이때 KEY 'submit'이 존재한다는 건, 사용자가 CHOICE 버튼을 눌렀다는 의미이다.
버튼이 눌렸다면 사용자가 선택한 이미지 파일 이름을 $filename에 할당하고
버튼이 눌리지 않았다면 기본적으로 images directory에 들어있는 1.jpg를 출력한다.
(+) <img> tag는 html에서 image를 출력하는 용도의 태그로
src 속성은 출력할 이미지의 경로를,
alt 속성은 문제가 발생해 이미지를 출력할 수 없을 경우 대체할 문구를 의미한다.
만약 사용자가 CHOICE 버튼을 눌렀고 입력한 파일 이름이 "2.jpg"라면
위와 같은 과정으로 <img> tag에 2.jpg가 담기게 된다.
그렇다면 결과를 한 번 확인해보자!!
images.php의 화면은 위와 같이 구성되는 걸 볼 수 있다.
기본적으로 제공되는 1.jpg 사진도 잘 나오고 있고,
filename을 입력하라는 문구와 함께 <input> tag가 제공되고 있다.
이번엔 이미지가 잘 변경되는 지 확인해보자.
<input>에 2.jpg를 입력하고 choice 버튼을 누르면
성공적으로 이미지가 바뀐 걸 볼 수 있다!!
images directory로 가서 확인해보면 이 이미지가
사용자가 고른 2.jpg와 동일한 사진임을 알 수 있다.
이제는 이번 POST의 목적대로 path traversal sequence를 사용해 secret.txt 내용을 읽어볼 것이다.
그 전에 미리 hanhxx directory에 secret.txt를 만들어두자.
secret.txt 내용은 위와 같다.
다시 form으로 돌아와서! secret.txt 내용을 읽기 위한 경로를 생각해보면
이미지를 가져오는 경로는 code에서 본 바와 같이 images directory이다.
secret.txt가 들어있는 hanhxx directory로 접근하기 위해선 images directory에서 한 번
상위 계층 directory로 빠져나와야 한다.
현재 directory에서 한 번 빠져나온 뒤, hanhxx directory로 들어가 secret.txt를 읽도록 값을 넣으면
화면에는 입력한 경로에 해당하는 이미지가 없기 때문에 alt 값이 출력 되지만
response 내용을 확인해보면
성공적으로 secret.txt 내용을 확인할 수 있다.
이처럼 path traversal sequence를 차단하지 못하면
공격자가 원하는 대로 directory를 옮겨 다닐 수 있게 되고 이는 결국
중요한 정보가 유출 당하는 사태로 이어질 수 있다!!
이번 POST에서는 직접 간단한 form을 구성하고 path traversal sequence로 악용될 수 있는
사례에 대해서 살펴보았다.
php code에 sequence를 차단하는 그 어떤 내용이 작성되어있지 않을 뿐더러
사용자가 입력한 값을 그대로 img tag에 반영하는 부분이 주 원인으로 보인다.
그렇다면 path traversal sequence를 차단하기 위해서 코드를 어떻게 개선할 수 있을 지 알아보도록 하자!