[Wargame] 드림핵 - pathtraversal

Song·2024년 11월 12일

드림핵

목록 보기
7/18

문제


소스코드

중요한 부분만 살펴보면, /get_info 경로에서 GET으로 요청을 받게되면 get_info.html을 반환하고, POST로 요청을 받으면 {API_HOST}/api/user/{userid}에서 정보를 받아와 get_info.html에 추가해 클라이언트에게 반환한다. 여기서 userid는 사용자가 입력하는 값이다. 그럼 userid 대신 ../과 같은 pathtraversal 공격을 사용하면 상위 디렉토리 정보를 받아올 수도 있을 것이다.

또한, /api/flag 경로에 접근하면 FLAG를 반환해준다. FLAG는 flag.txt를 의미한다.

즉, userid 대신 path traversal 공격을 사용해 /api/flag 경로에 접근하면 flag 값을 얻을 수 있을 것이다.


풀이 - Python

페이지에 접속하면 Get User Info 링크가 존재한다. 클릭해서 이동.

이동하면, userid 입력란에 guest가 적힌 것을 볼 수 있고, View를 누르면 해당 유저의 정보를 받아오게 된다.

pathtraversal을 테스트해보기 위해 ../를 입력해본다.

View를 눌러 전송해보면 ../ 값이 Undefined로 변경되어 전송되는 것을 볼 수 있다.

결과로는 아무것도 받아오지 못한다. 특정 값을 프론트엔드 측에서 JS를 이용해 검증하는 것 같다. 이를 우회하려면 Proxy 혹은 python 등을 활용해 프론트엔드 측을 거치지 않고 바로 요청을 전송하는 방법이 있다. 여기서는 python을 사용해 우회한다.

//python http 요청 모듈 requests import
import requests as req

//URL, 파라미터(data) 지정
URL = "http://host3.dreamhack.games:11536/get_info"
data = {"userid" : "../flag"}

res = req.post(URL, data=data)

print(res.text)

이전에 파라미터로 userid만 전송하는 것을 봤기 때문에 userid에 ../flag를 입력해 전송한다.

응답을 확인해보면 중간에 플래그 값이 적혀 있는 것을 볼 수 있다.


풀이-개발자 도구

개발자 도구 > setting > 자바스크립트 사용 중지를 체크하고 userid 입력란에 ../flag를 입력하면 바로 플래그 값을 얻을 수 있다.

profile
안녕하세요

0개의 댓글