본문 바로가기

Book

웹 개발자를 위한 웹 보안: 10장 요약 - 세션 하이재킹

728x90

 

 

서버의 세션 관리 기능에 취약점이 없을 경우에도 해커는 다른 사용자의 유효한 세션을 도용할 수 있는데, 이를 세션 하이재킹이라고 한다.

 

세션 작동 방식

사용자가 HTTP에서 자신을 인증하면, 웹 서버는 로그인 프로세스 중에 사용자에게 세션 식별자를 할당한다. 세션 식별자를 통해 웹 서버는 함께 제공된 세션 ID를 인식해 적합한 사용자에게 매핑한다. 세션 ID는 사용자 이름과 달리 임시로 할당된 값이어야 한다. 해커들이 사용자 이름을 가지고 세션 ID를 도용할 수 있기 때문이다. 사용자 이름 외에도 웹 서버는 사용자의 최근 활동과 관련된 정보인 세션 상태를 세션 ID 옆에 저장한다.

 

전통적인 세션 관리 모델에서, 웹 서버는 세션 상태를 메모리에 유지하고 웹 서버와 브라우저는 세션 식별자를 앞뒤로 전달한다. 이를 서버 측 세션이라고 한다. 서버 측 세션은 일반적으로 안전하지만, 웹 서버가 세션 상태를 메모리에 저장해야 하기 때문에 확장성에 제한이 있다. 동일한 사용자의 후속 웹 요청이 다른 웹 서버로 전송된다면, 새 웹 서버가 반환되는 사용자를 인식할 수 없기 때문에 웹 서버는 세션 정보를 공유할 수 있는 방법이 추가로 필요하다.

 

클라이언트 측 세션을 구현하는 웹 서버는 Set-Cookie 헤더의 세션 ID만 전달하는 대신 쿠키의 모든 세션 상태를 전달한다. 또한 세션 상태가 HTTP 헤더에 설정되기 전에 세션 상태를 텍스트로 직렬화한다. 클라이언트 측 세션을 사용하면 사이트의 웹 서버가 더 이상 상태를 공유할 필요가 없지만 보안 문제가 일어나기 쉽다. 따라서 클라이언트 측 세션 쿠키를 보호하기 위해선 클라이언트로 보내기 전에 직렬화된 쿠키를 암호화하는 것이다. 이후에 브라우저가 쿠키를 반환하면 웹 서버는 쿠키를 해독한다. 쿠키 전송 시 디지털 서명을 추가하는 것도 세션 쿠키를 보호하기 위한 다른 방법이다. 이를 통해 웹 서버는 다른 서명 값을 계산하고 변조될 때 세션을 거부하므로 세션 상태를 조작하려는 시도를 감지할 수 있다.

 

세션을 가로채는 방법

공격자는 쿠키 도난, 세션 고정, 취약한 세션 ID 활용 세 가지 방법을 이용해 세션을 가로챈다.

 

일반적으로 공격자는 인증된 사용자에게서 쿠키 헤더의 값을 도용해 세션 하이재킹을 수행한다. 크로스 사이트 스크립핑 (XSS)이나 네트워크 트래픽 스니핑, 또는 의도하지 않은 HTTP 요청을 트리거 (CSRF) 하는 방식으로 쿠키를 훔친다. 크로스 사이트 스크립팅 공격으로 세션 하이재킹을 해제하려면 Set-Cookie 헤더에 모든 쿠키를 HttpOnly로 표시해 브라우저에 자바스크립트 코드에서 쿠키를 사용할 수 없도록 지시해야 한다. 또한 네트워크 트래픽 스니핑을 막기 위해선 HTTPS를 사용하도록 설정하고, 쿠키를 보안(Secure)로 표시해 브라우저에서 HTTP로 암호화되지 않은 쿠키를 보내지 않도록 해야 한다. 마지막으로 CSRF공격을 사용하는 공격자는 사용자의 세션 쿠키에 액세스할 필요 없이 악의적인 링크를 클릭하게 하고, 이 링크로 트리거된 HTTP 요청과 함께 세션 쿠키를 보내도록 한다. 이러한 공격을 방지하기 위해선 SameSite속성을 이용해 외부 사이트에서 트리거된 모든 HTTP 요청에서 쿠키를 제거하도록 해야 한다. SameSite=Lax설정을 사용해 Get 요청에서만 쿠키를 허용하도록 브라우저를 구성하면 모든 콘텐츠를 보려고 재로그인해야 하는 번거로움을 해결할 수 있다.

 

개발자가 URL 끝에 세션 ID를 추가하도록 브라우저를 구성하면 로그 파일에서 세션 ID를 유출할 수 있다. 이렇게 사용자 세션을 가로챈 후에 세션 고정에 취약한 웹 서버가 URL에서 알 수 없는 세션 ID를 발견하면 사용자에게 자체 인증을 요청해 인증된 세션으로 변환하게 된다. 이렇게 공격자와 사용자가 브라우저에서 동일한 URL을 사용하게 되면 링크를 클릭하는 모든 사용자의 세션을 하이재킹할 수 있다. 더미 세션 ID가 해커가 알고 있는 실제 세션 ID로 변환되는 것이다. 이러한 공격을 방어하기 위해선 로그인 할 때마다 새로운 세션 ID를 발급하거나, 정기적으로 세션 ID를 만료시키는 것이 중요하다.

 

그러나 가장 위험한 방법은 세션 ID를 추측하는 것이다. 세션 ID는 숫자에 불과하므로 공격자는 잠재적인 세션 ID를 열거하고 유효한 세션을 찾을 때까지 웹 서버를 테스트할 수 있다. 따라서 웹 서버의 설명서를 참조해 임의 번호 생성 알고리듬으로 생성된 추측할 수 없는 큰 세션 ID를 사용하는지 확인하고, 웹 스택의 취약점을 패치할 시기를 알려주는 보안 권고 사항을 항상 숙지하여야 한다.