https://dreamhack.io/wargame/challenges/6
vm에 생성된 웹에 접속하면 다음과 같은 사이트를 볼 수 있다
우측 상단 Login을 들어가면 로그인을 할 수 있다
이제 단서를 찾기위해 python코드를 살펴보자
문제의 코드에서 위 사진 부분을 보면, 유저는 게스트와 admin 계정이 존재하며, admin 계정으로 로그인하게되면 플래그를 주는 코드임을 알 수 있다.
그런데 username이 게스트인지 admin인지 받아오는 곳은 쿠키이다.
HTTP 프로토콜은 하나의 요청에 하나의 응답을 한 후 연결을 종료하는 것을 의미하는 connectionless, 통신이 끝난 후 상태 정보를 저장하지 않는 것을 의미하는 stateless의 특징을 가져, 웹 서버는 클라이언트를 기억할 수 없다.
이 문제를 해결하기 위해 쿠키(cookie)라는 개념이 도입된 것이다.
즉, 쿠키는 어떤 웹 사이트에 대해 클라이언트마다 설정한 정보와 기록을 일정 기간 저장하여 클라이언트가 특정 사이트를 재방문할때마다 개인적인 환경(맞춤형 서비스)을 재설정하는 불편함을 해결해준다.
쿠키는 key와 value로 이루어진 일종의 단위로, 서버가 클라이언트에게 쿠키를 발급하면 클라이언트는 서버에게 요청을 보낼때 쿠키를 같이 보낸다.
이후 서버는 클라이언트가 보낸 쿠키를 확인해 클라이언트를 구분할 수 있다.
그러나 쿠키가 가진 단점은 클라이언트의 브라우저에 저장되는 것인데, 이러한 문제로 쿠키의 정보를 조작할 수 있다.
그러면 문제 웹 사이트의 개발자 툴을 통해 쿠키항목을 살펴보자
아직 로그인이 되지않은 상태에선 쿠키가 존재하지 않는다.
우선 클라이언트에 대한 쿠키를 남기기 위해 마저 남은 python코드를 보고 로그인 단서를 확인하자.
GET 요청을 통해 서버로부터 로그인 창을 클라이언트에게 띄워주고(웹 렌더링),
POST 요청을 통해 서버에게 username과 password를 전달해준다.
이후 password는 이전 딕셔너리에 있던 users의 키 값이 password와 일치하면 로그인이 성공한다.
이것을 토대로 guest 계정으로 로그인해보자
guest
에 대응하는 users의 키값은 guest
이다
guest 계정으로 로그인하면 위 사진과 같은 문구를 띄워주는데,
로그인이 성공했으므로 set_cookie()
를 통해 서버에게 쿠키를 전달해준다.
이제 다시 개발자 툴에서 쿠키를 확인해보자
guest에 대한 쿠키가 존재하는 것을 확인했다.
앞서 username은 쿠키의 값으로부터 받아온다는 것을 확인했다.
이 상태라면 해당 문제 웹을 닫고 다시 접속해도 게스트로 로그인이 유지된다. 쿠키가 저장되어 있기 때문이다!
해당 코드를 통해 username이 쿠키의 값으로부터 받아오기 때문에 username에 admin을 전달해주면 플래그를 얻을 수 있다
이렇게 username에 대응하는 값을 admin으로 바꿔주고 새로고침을 해보면..
문제 웹 사이트에서는 우리를 admin으로 반겨주게 된다!