티스토리 뷰
(WebGoat) A1. Broken Access Control - Hijack a session
SalaYH 2024. 3. 8. 01:01본격적으로 WebGoat에서 제공하는 주요 취약점에 대해서 하나씩 진행할 차례가 되었다.
첫 번째 교육은 Broken Access Control 이고, 그 중에서 세션 하이재킹에 대한 내용이다.
퀴즈에서는 hijack_cookie 값을 예측해서 Access Control을 우회하라고 한다.
우선 hijack_cookie가 어떻게 생겼는지 확인해보기 위해 로그인을 시도해본다.
존재하지 않는 계정으로 로그인을 시도해보니, 로그인 실패 시에도 cookie 값으로 hijack_cookie가 생성되는 것으로 보인다.
몇 번의 로그인을 시도해보니, hijack_cookie가 대략적으로 예측되는 부분이 있다.
우선 첫번째 숫자는 1씩 증가하는 것으로 보이고, 두번째 숫자는 대략 현재시간을 나타내는 것으로 보인다.
중간 패킷을 탈취했다는 가정하여, 쿠키값을 사용하여 로그인을 해보지만 여전히 세션 인증에 실패하고 있다.
실제 전달되는 값과 저장된 값이 상이한 것으로 예상된다.
그럼 이제 코드를 분석해보자
해당 기능의 로그인을 시도할 때 사용되는 로직을 보면, 쿠키(hijack_cookie)값이 없으면 입력한 ID/Password로 새로운 인증을 만들어서 인증값을 쿠키로 설정한다. 그리고 만약 쿠기값이 있으면 쿠키값으로 인증세션을 조회하는 것을 알 수 있다. 결국 사용자에게 발급된 hijack_cookie 값이 세션ID와 같은 인증값인 것을 알 수 있고, 이 쿠키값을 통해 인증을 우회할 수 있을 것이다.
여기서 AuthenticationProvider의 구현로직을 보면, authentication 인증객체에 설정된 ID(hijack_cookie)가 null이 아니라면(즉, 요청 시 hijack_cookie 값을 전달했다면), 해당 세션이 인증되었다고 설정한다. 그리고 인증객체에 ID가 null이라면(즉, hijack_cookie가 전달되지 않았다면), GENERATE_SESSION_ID를 통해 인증객체 ID를 새로 발급하는 것을 알 수 있다.
여기서 GENERATE_SESSION_ID가 앞 숫자는 Sequence number이고, 뒷 숫자는 현재시간이 사용되고 있는 것을 알 수 있다.
여기서 중요한 포인트는 authorizedUserAutoLogin 메서드이다. 해당 함수에서는 임의의 값이 75보다 작지 않으면 인증결과와 상관없이 AUTHENTICATION_SUPPLIER를 호출하여 새로운 세션ID를 저장하는 것을 알 수 있다. 결국 응답값에 전달되는 값이 10000001-xxxxxxxxx 였다면, 그 이후 authorizedUserAutoLogin 메서드를 통해 1이 증가된 10000002-xxxxxxxxx 가 75% 확률로 세션에 저장된다는 것을 알 수 있다. 이때 뒷 자리는 현재 시간이므로, 응답값에 전달된 값과 같거나 큰 차이가 없을 것이다.
이 인증로직을 우회를 분석해보면, 존재하지 않는 계정이라도 한번 로그인을 시도하면 세션ID가 발급될 것이고, 응답값으로 전달받은 쿠키값의 앞자리에 1을 증가시켜서 쿠키(hijack_cookie)값으로 전달하면 인증한 것으로 처리가 된다는 것을 알 수 있다. 아래 스크린샷 처럼 쿠키 유추 및 추가를 통해 인증도용에 성공한 것을 알 수 있다.
이번 퀴즈에서 취약점은
- 세션ID가 생성될 때 Sequence number와 Timestamp를 사용하기 때문에, 세션ID가 유추가 가능하다.
세션ID는 고정되지 않고 유추가 불가능한 값이 생성되어야 한다. 세션ID는 직접 생성하기 보다는 안전한 랜덤함수 또는 높은 엔트로피를 제공하는 세션ID 생성 API를 이용하는 것이 안전하다. - authorizedUserAutoLogin 메서드가 인증된 사용자에 대해서 저장하는 것이 아닌 임의의 75% 확률로 세션 ID등록하고 있다.
세션 목록에 등록되어야 하는 세션ID는 확률적으로 등록이 아니라, 인증에 성공한 인증 객체의 세션ID만 등록이 되어야 한다.
등이 있을 것이다.
추가적으로는 현재 세션목록이 최대 50개까지 저장되고 있고, 50개가 넘어서게 되면, 세션 만료시간과 상관없이 가장 오래된 세션을 삭제해버리고 있다. 이는 Brute Force 공격 등을 통해 정상적인 유저의 세션을 강제로 만료시킬 수 있게 할 수 있다. 유효 세션은 세션이 타임아웃으로 만료 되거나, 유저가 로그아웃을 하기 전까지는 세션이 유효해야 한다.
'Web Analytics > WebGoat' 카테고리의 다른 글
(WebGoat) A1. Broken Access Control - Missing Function Level Access Control (0) | 2024.03.18 |
---|---|
(WebGoat) A1. Broken Access Control - Insecure Direct Object References (0) | 2024.03.10 |
(WebGoat) General - CIA Triad (0) | 2024.03.06 |
(WebGoat) General - Developer Tools #2 (0) | 2024.03.05 |
(WebGoat) General - Developer Tools #1 (0) | 2024.03.05 |
- Total
- Today
- Yesterday