본문 바로가기
WebGoat

[WebGoat] Hijack a session 풀이

by 당코 2023. 4. 8.

자체 세션 ID로 개발할 때 사용자별 세션 ID가 복잡하고 임의적이지 않으면 응용 프로그램은 세션 기반 브루트 포스 공격에 매우 취약하다고 한다.

공격을 통해 다른 사용자의 인증된 세션에 대한 접근권한을 얻는 것이 목표인 문제이다.

 

문제에서 hijack_cookie라는 값을 예측해서 다른 인증된 사용자의 정보를 얻으라고 한다.

 

먼저 다음과 같이 아무 아이디와 비밀번호를 입력해서 access 요청을 하였다.

 

Burp Suite를 통해 해당 login 요청에 대한 request와 response를 intercept하여 HTTP History를 통해 확인하였다.

response를 보면 실패 문자와 함께 hijack_cookie에 임의의 랜덤 값이 응답으로 온 것을 볼 수 있다.

 

한번으로는 알 수 없으니 로그인 요청을 여러번 반복해서 해보겠다.

response의 hijack_cookie의 값을 보면 앞부분의 숫자가 76, 77, 78 이렇게 1씩 늘어나다가 갑자기 2가 늘어나 80이 된 것을 볼 수 있다.

이것으로 유추해 볼 때 내가 아닌 다른 누군가가 로그인 요청을 한 것으로 예측 할 수 있다.

인증된 사용자인지 아닌지는 알 수 없지만 인증된 사용자로 가정 하고 세션을 예측해 보겠다.

다른 사용자의 세션 ID의 앞부분은 956239978486504678과 956239978486504680의 사이값인 956239978486504679일 것이고, 뒷부분은 시간과 관련된 값으로 예측 되므로 1680878408371 ~ 1680878408500 사이 값 중 하나일 것이다.

Burp Suite의 Intruder을 통해 세션값을 알아보겠다.

 

login 요청을 보낸 request를 payload로 가지고 와서 Cookie에 hijack_cookie를 추가해주었다.

우리가 확인해 봐야할 371~500 사이의 값들을 하나씩 변조시키면서 맞는 값을 찾아보겠다.

Payload는 숫자만 오기 때문에 Numbers로 설정해주고

범위는 371부터 500까지 1씩 증가시켜가며 확인해준다.

숫자는 모두 3자리 숫자이기 때문에 3, 소수점은 고려하지 않기 때문에 0으로 해주었다.

start attack을 하여 결과를 확인해보자.

놀랍게도 내가 보낸 login 세션의 값과 동일한 payload값이 나왔다.

내부적으로 구현을 어떻게 했는지는 모르지만 내가 request를 보낼 때 다음 세션값을 동일하게 생성하는 것이 아닐까 추측해본다.

결과적으로 다른 인증된 사용자의 세션 값은 956239978486504679-1680878408371 인것을 알 수 있다.

 

마지막으로 이 세션값을 로그인 request에 넣어서 해당 사용자인척 하고 넘겨보겠다.

아이디와 비번을 임의로 설정하고 access를 한 뒤에 해당 request를 intercept하여 우리가 구했던 hijack_cookie 값을 넣어 서버로 보내면 해당 사용자로 인식될 수 있다.

 

응답을 보내고 forward를 하다보면 성공했다는 response와 함께 해당 화면이 출력되며 문제를 완료하게 된다.

 

문제에 대해 궁금하신 것이 있다면 댓글로 남겨주세요:)

'WebGoat' 카테고리의 다른 글

[WebGoat] SQL Injection(intro) 9번 ~ 13번 풀이  (0) 2023.04.08