[WebGoat] (A1)-1. Hijack a session

신지훈·2025년 5월 19일

WebGoat(웹 해킹)

목록 보기
1/8
post-thumbnail

1. 해킹 대상

Hijack a session에서는 개발자가 직접 세션아이디나 토큰을 만들 때 복잡성과 무작위성을 제대로 고려하지 않고 개발했을 경우 해커의 무차별 대입 공격으로 인해 이 세션아이디나 토큰이 탈취될 수 있다는 내용을 공부할 수 있다. 이렇게 취약한 세션 아이디, 쿠키를 해킹해봄으로써 어떤 점을 주의해야할지 알아보자.

2. 모의 해킹 실습

1) 샘플 얻기


먼저 위와 같이 무작위의 아이디와 비밀번호를 입력하고 brup suite에서 Proxy 탭에서 Http history에서 해당 요청의 request와 response를 살펴보자.


request를 보면 JESSIONID는 WebGoat를 로그인을 했을 때 발급받은 세션 아이디이고 Hijack a session으로 로그인을 했을 때 발급받은 세션아이디는 response에 Set-Cookie에 있는 hijack-cookie이다.

여기서는 hijack-cookie가 복잡성과 무작위성을 고려하지 않고 만들어진 세션아이디이다. 이제 brup suite의 Intruder 기능을 활용하여 이 무차별 대입공격을 실행해보자.

먼저 무작위 대입을 하기 위해 해당 세션아이디가 어떤 규칙을 가졌는지 알 수 있다면 무작위로 대입할 범위를 줄일 수 있다. 그러기 위해 몇개의 샘플 세션 아이디가 필요하다.

2) Intruder

여러개의 세션아이디를 얻기 위해서 직접 여러번 요청을 통해서 샘플을 얻을 수 있겠지만 앞서 언급한 Intruder를 통해 여러개의 샘플을 쉽게 얻을 수 있다.

Intruder은 자동화 공격 도구로 동일한 HTTP 요청을 여러 번 반복적으로 보내는 무차별 공격을 지원하는데 필요에 따라 설정된 위치를 변경할 수 있는 기능이다.

그럼 이 Intrider기능을 활용하여 샘플 세션아이디를 얻어보자.

이전에 요청과 응답을 확인한 곳에서 아무곳에서나 오른쪽 마우스를 누르고 Send to Intruder를 눌러준다.

그럼 자동으로 Intruder 탭에서 이전에 요청했던 Request값들을 확일 할 수 있다. 그럼 이제 샘플을 얻기 위해 비밀번호로 0~9까지 10번 보내보자.

무작위로 값을 변경할 부분을 드래그 한 후 Add 버튼을 누르면 드래그 한 부분 양쪽에 기호가 생기고 이제 값을 변경할 준비가 된 것이다

값을 변경할 부분이 추가가 되면 화면 오른쪽에 다음과 같은 payloads가 생성되고 빨간 부분과 같이 숫자로 0~9까지 1씩 증가하여 값을 대입하도록 설정한다. 그리고 맨 아래의 설정은 입력하는 값이 10진수로 최소와 최대로 대입되는 수가 1자리임을 나타내는 설정이다. 설정이 완료되면 start attack 버튼을 눌러보자.

3) 분석

다음과 같이 공격 결과의 10개의 Response에서 hijack-cookie의 값을 살펴보자.

이해를 위해 순서대로 cookie만 모아서 보면 다음과 같이 '-'의 블럭에서 마지막 3자리와 뒤쪽 블록 마지막 3자리만 바뀌는 것처럼 무작위성과 복잡성을 고려하지 않은 취약한 cookie를 확인할 수 있다.

이런 경우 앞의 771,773,774...로 증가하는 것으로 봐서 요청하는 순서대로 1씩 증가하는 것을 확인할 수 있고, 여기서 772가 없는 것은 다른 사용자가 요청했음을 유추할 수 있다. 이 요청이 성공했을 지 실패했을 지 알 수 없지만 값을 알아낸 후 인증을 시도할 충분한 가치가 있어 보인다.

뒤에 있는 블록은 자주 사용되는 Unix 의 타임스탬프 값으로 시간에 대한 값이 들어있다.

정리하자면 772의 번째의 요청이 ...6394~...6675시간 사이에 실행되었고 이 요청이 인증된 값인지 실패한 값인지 알 수 없지만 무작위로 값을 만들어 요청을 보내서 인증된 쿠키 값인지 확인해 볼 필요가 있다.

4) 무작위 공격

그럼 이 공격 역시 Intruder를 통해 실행해보자. 역시 오른 쪽 키를 누른 후 Send to Intruder를 눌러준다.

무작위 공격에 들어가기 앞서 WebGoat에서 로그인 요청을 한 번 더 해보자.

그럼 이전과 달리 요청에 JESSIONID 뿐 아니라 hijack_cookie가 함께 들어가고 우리는 이 형식에 맞춰서 무작위로 hijack_cookie값을 보내야한다.

그럼 Intruder에 가서 다음과 같이 비어있던 772번째 요청으로 바꾸고 시간은 값을 나타내는 마지막 3자리 수를 드래그하여 Add한 후 payloads에서 위에서 확인했던 것처럼 394~675사이로 1씩 증가하여 값을 보내도록 설정한다. 그리고 드래그 한 곳에는 무조건 3자리 수로 들어가야하는 것 역시 설정한 후 공격버튼을 눌러 결과를 확인해보자.

결과에서 Length를 내림차순으로 정리해보면 혼자 길이가 다른 것이 있는데 이를 확인해보자.

feedback에 성공했다는 문구로 인증된 토큰임을 확인할 수 있다. 그리고 request를 보면 인증된 토큰을 알 수 있게 된다.

이제 실제 웹사이트였다면 이 토큰으로 인증된 사용자인척 여러가지 요청을 보낼 수 있게 된다.

3. 정리

hijack는 들어온 순서, 요청 시간을 가지고 만든 복잡성과 무작위 성이 없는 취약한 쿠기이다.

이 취약한 쿠키를 여러개 샘플을 구해서 여러가지 정보들을 유추하고 그 유추한 범위 내에서 Intruder로 무차별 공격을 함으로써 인증된 쿠키를 얻어낼 수 있다.

이처럼 개발자가 직접 만든 세션이나 토큰을 사용할 경우 무작위 대입 공격 또는 유추를 통한 탈취를 방지하기 위해 영문과 숫자를 섞어 무작위로 값을 생성해야하고 길이는 최소 12byte 이상으로 만들 것이 권장된다.

profile
주주주주니어 개발자

0개의 댓글