먼저 사이트에 접속해보면
단순한 사이트가 나온다.
Get User Info에 들어가보면
form이 하나 있고 내용이 guest로 채워져 있다.
View를 눌러보면
guest에 대한 정보가 출력된다.
그런데 View를 누르고 결과가 출력되기까지 그 짧은 순간에 userid 입력칸이 guest에서 0으로 바뀌는 것을 볼 수 있다.
문제 파일에 관련된 코드가 있는지 확인하기 위해 문제파일을 열어보았다.
users에 보면 0인 경우 guest, 1인 경우 admin에 대한 정보를 갖고 있다.
코드에는 guest를 0으로 바꾼다는 내용이 없다.
따라서 브라우저에서 페이지 검사를 통해 요소를 보니
script태그 안에 사용자의 입력값(guest/admin)에 따라 0 또는 1로 변경해서 return을 한다.
이것을 통해 브라우저에 있는 script에 의해 사용자의 입력값이 0, 1로 바뀌며 0과 1에 해당하는 정보를 출력한다는 것을 알 수 있다.
다시 코드를 살펴보면 POST 방식일 경우 get_info.html template을 render하는데 info는 API_HOST/api/user/userid에서 가져온 text로 설정하는 것을 볼 수 있다. (API_HOST의 경우 127.0.0.1:8000이므로 크게 신경 안써도 된다)
userid는 우리가 웹에 입력한 form으로 부터 받아오는데 script에 의해 0또는 1로 변경된 채로 받아온다.
위의 info에 해당하는 값을 받아오기 위해 /api/user/<uid>로 접근을 하게 되면 users안에 있는 uid에 해당하는 값을 return한다.
(이 코드의 경우 0일 경우 guest, 1일 경우 admin)
만약 해당하는 값이 없다면 info는 비어있는채로 반환된다.
(입력칸에 admin, guest가 아닌 다른 무언가를 입력하면 { }가 출력되는 것을 볼 수 있다)
flag와 관련된 코드를 살펴보면 /api/flag에 접근하면 FLAG 값을 반환하는 것을 확인할 수 있다.
따라서 FLAG값을 가져오기 위해서는 입력값을 적절히 조정해 /api/flag로 이동을 시켜 info값을 FLAG값으로 설정하게 하면 된다.
info = FLAG가 된다면 페이지를 render할 때 FLAG값을 출력하게 될 것이다.
form에 입력하는 값이 변경되지 않고 그대로 보내기 위해서는 브라우저의 script가 실행되지 않도록 해야한다.
script를 보면 getElementById('userid')를 사용하고 있다. 따라서 form에 있는 userid라는 id를 지워버린다면 script는 해당 form을 인식하지 못하고 script는 실행되지 않을 것이다.
또한 /api/flag로 접근을 해야하는데 기본적으로 제출할 때 접근하는 경로는 /api/user/{userid}이다.
따라서 한단계 상위 디렉토리로 간 후 flag로 접근하도록 만들어야 한다.
상위 디렉토리로 이동하는 방법으로 ../를 사용한다.
결과적으로 입력하는 값과 id를 삭제한 모습은 다음과 같다.
../를 통해 상위 디렉토리(/api)로 이동한 후 flag로 이동(/api/flag)
이 상태에서 View를 누르게 되면
FLAG값이 출력된다.
2022.04.04 - [IT/개념] - Path Traversal(Directory Traversal)
'보안 > Dreamhack' 카테고리의 다른 글
Dreamhack: simple_sqli (0) | 2022.04.06 |
---|---|
Dreamhack: file-download-1 (0) | 2022.04.05 |
Dreamhack: xss-1 (0) | 2022.04.03 |
Dreamhack: cookie (0) | 2022.04.03 |