
전에 문제는 HTTP의 Request를 가로채서 이것저것 내용을 수정하는 문제와 다르게 위에 로그인 부분만 던져주고 있네요. 이번 문제는 'hijack_cookie' 값을 예측하기입니다. hijack_cookie 값은 WebGoat에서 사용자와 익명 사용자를 구분하기 위해 사용됩니다.
요약
1. hijack_cookie 값을 예측해서 사용자 계정으로 로그인하기
먼저 요청값으로 어떠한 값들이 전달하는지 확인해보겠습니다.

Request에서는 위와 같은 값들이 담겨서 요청하게 됩니다. 본문에는 제가 입력한 ID와 PW가 담겨서 보내지네요.

Response에서는 위와 같은 값들이 보내지는데 3번째 줄을 보면 Set-Cookie 라는 헤더가 보입니다. 해당 헤더는 클라이언트에 쿠키를 설정하는 역할을 합니다. 어떠한 값이 저장되는지 보니 hijack_cookie라는 값이 저장되는 것을 볼 수 있습니다.
임의의 아이디와 비밀번호를 입력한 뒤 계속 로그인을 시도해 보았습니다. 하지만 이미 한번 부여받은 쿠키값은 변하지 않았습니다.



그러다 문득 hijack_cookie 값을 지우고 보내면 어떻게 될까? 라는 생각이 들어서 시도해봤습니다.

그랬더니 위에 사진과 같이 응답에서 새로운 hijack_cookie 값을 보내주었습니다. 이를 토대로 생각을 해보면 쿠키값이 없는 클라이언트가 처음에 로그인을 시도하면 서버에서는 클라이언트를 식별하기 위해서 hijack_cookie 값을 전달하는 거로 생각할 수 있습니다. 만약에 로그인에 성공한다면 해당 쿠키값을 가지고 계속 서버와 통신하면서 로그인 상태를 유지할 것이고 로그인에 실패하면 해당 쿠키값을 가지고 계속 익명 사용자인 상태로 남게 되는 거 같습니다.
hijack_cookie 값이 사용자와 익명 사용자를 구분하는 데에 사용된다는 것을 알았습니다. 그럼, 이제 hijack_cookie 값을 이용해서 로그인할 수 있습니다.
하지만 문제가 하나 있습니다. 하나하나 값을 변경하면서 +1을 하기에는 너무 양이 방대합니다. 만약 운이 좋아서 로그인한 사용자를 금방 찾을 수도 있겠지만 그렇지 않다면 너무 오랜 시간을 사용하게 됩니다. 다른 방법을 찾아야 합니다.




hijack_cookie 값을 계속 새롭게 받을 때 규칙이 하나 있었습니다. -(하이픈) 앞에 자리 숫자가 1씩 커지거나 2씩 커지고, -(하이픈) 맨 뒤에 숫자 3자리가 시간에 따라 점점 증가하는걸 볼 수 있었습니다. 여기서 의문이 하나 생깁니다. 왜 -(하이픈) 앞에 자리 숫자는 1씩 증가하지 않고 도중에 2씩 증가하는 걸까? 그 이유는 아마 그 시간대에 누군가 로그인을 시도했다는 것을 의미할 겁니다. 따라서 우리는 그 로그인을 시도한 사람이 사용자인지 익명 사용자인지는 모르지만 시도해 볼 가치는 있습니다. 덕분에 우리는 이러한 근거로 로그인을 시도한 해당 사람의 근처값을 사용하여 많은 시간을 아낄 수 있을 거 같습니다.



74-76 사이에 로그인을 시도한 75 사용자와 1772448191021-1772448192925 사이의 시간대를 유추하여 1021~2925까지 값을 +1씩 증가하여 해당 시간대에 로그인을 시도한 사용자를 찾았고, 또한 그 사용자가 다행히 로그인이 가능한 사용자였습니다. 응답 요청에서 보이듯이 임무를 성공적으로 완료했다고 나와 있습니다.
이러한 공격이 가능했던 주된 이유는 바로 개발자가 직접 세션을 만들 때 세션 값을 무작위로 만들지 않아서 해커가 쉽게 규칙을 찾아내서 세션 값을 탈취할 수 있다는 내용의 문제입니다. 이를 방지하기 위해서는 개발자는 직접 세션을 개발하지 말고, WAS(Web Application Server)에서 관리하는 세션을 사용하거나 직접 세션을 개발할 거면 무작위로 값을 생성하는 것이 이러한 공격에 대해 예방할 수 있는 좋은 방법이라고 생각합니다.
부족한 글 읽어주셔서 감사합니다.