Security2014. 7. 2. 23:50
반응형

Session Fixation 공격이란?


 세션 하이재킹 기법의 하나로 유효한 유저 세션을 탈취하여 인증을 우회하는 수법이다. 넓은 의미에서 세션 하이재킹이란 일반적으로 알려진 웹 어플리케이션의 세션ID를 탈취하는 수법 이외에도 TCP레벨에서 일어나는 공격까지 포괄적으로 칭할 수 있겠지만, Session Fixation 공격은 주로 웹 어플리케이션에 존재하는 세션 관리상의 제한이나 취약점을 이용하여 공격하는 수법입니다.


 Session Fixation은 일반적으로 세션 고정 공격으로 번역되는듯 합니다만, 원리나 공격방식에 비추어 볼때 세션 주입 혹은 세션 설치 공격등의 용어가 좀더 이해하기에 쉽지 않을가 생각됩니다. 일반적으로 알려진 웹 어플리케이션의 세션 하이재킹 공격은 세션ID탈취, 사용자 인증 완료 대기등의 과정을 통해 이루어집니다만 이 공격은 세션ID를 탈취하는 과정이 공격에 사용할 세션ID의 확보(발행 혹은 선택)하고 주입하는 과정으로 대체된다는 점에서 차이가 있다고 할 수 있다. 다시말해서 덫을 놓고 기다리는 것과 비슷하다고 할수 있겠습니다.



예상되는 공격 시나리오


  1. 주입할 세션을 준비
  2. 세션을 주입할 코드를 설치하고 유도한다.
  3. 적절한 모니터링을 통해 인증을 통과한 세션을 확인하여 세션 하이재킹을 한다.



공격방법


 공격방법에 대해서 알아보려면 왜 공격이 가능한지에 대해서 알아두어야 할 듯합니다. 간략하게 웹 어플리케이션 서버가 클라이언트와 세션ID를 주고 받는 방식을 알아보면 아래와 같습니다.


  1. URI상에 혼입되있는 경우(톰캣의 경우 URI상에 ;jsessionid=세션ID)
  2. 리퀘스트 파라메터를 이용(이경우에는 URL상에 표기될수도 아닐 수도 있음) 
  3. 쿠키를 이용하는 방법.


 별도의 특수한 방법을 배제하고 일반적으로 위와같은 방법을 이용하여 세션ID를 서버에 요청과 함께 전달하게 됩니다. 이처럼 세션ID를 주고 받는 과정에 준비된 별도의 링크를 클릭하게 한다든지 준비된 세션ID를 쿠키에 셋하는 등 세션ID에 개입할 수 있는 여지가 있기때문에 이같은 공격이 가능하다고 할 수 있습니다.



 공격방법1

준비된 세션ID가 포함된 URL혹은 폼을 준비하여 희생자로 하여금 클릭하도록 유도한다.

 

 공격방법2

클라이언트 측 실행가능한 스크립트를 이용하여(해당 웹 어플리케이션의 XSS취약점등을 이용) 준비된 세션ID를 희생자의 쿠키에 주입(브라우저에 따라선 일명 쿠키 몬스터(Cookie Monster)라고 불리는 상위 도메인을 이용하여 쿠키를 주입하는 방법도 존재)

<script>document.cookie="jsessionid=함정세션ID";</script>

 공격방법3

메타 태그를 이용하여 준비된 세션ID를 희생자의 쿠키에 주입(마찬가지로 쿠키 몬스터 취약점 존재)

<meta http-equiv="Set-Cookie" content="jsessionid=함정세션ID">


 기타

  그외에 서브도메인 쿠키를 이용한 방법이나 물리적인 공격(주변인이 직접 희생자의 PC에 준비한 세션ID주입 - 그럴 여유가 있으면 뭐든지 가능하겠지만... 자리를 비울때는 스크린 락을 이용하여 컴퓨터에 접근할 수 없도록 해둡시다.) 등



대책


 위에서 열거한 것처럼 공격방법에는 여러가지가 있으나 방어하는 방법은 간단하다. 바로 인증절차 후에 인가한 세션은 신규 세션을 발행하여 처리하는 방법이다. 공격자가 주입한 세션으로 인증절차를 통과하였다고 하더라도 인가된 세션은 신규세션이라면 공격자가 가지고 있는 세션ID로는 인증을 우회할 수 없기 때문이다. 다만 운영환경상에 제약으로 신규로 세션을 발행하지 못하거나 하는 경우는 인가시점에 쿠키상에 별도의 토큰을 발행하여 매 리퀘스트별로 세션영역에 보관된 토큰과 매칭을 시키는 방법등으로 접근을 제어할 수 있을 것이다.


 최근에 사이트들에 보이는 IP보안과 같은 IP대역을 이용하여 제어하는 방법, User-Agent를 이용하여 추가적으로 확인하는 방법 등도 어느정도 효과를 볼 수 있겠지만 사실 본질적인 해결책은 아니므로 위의 해결책을 이용하는 편이 좋을듯 하다.(세션 하이재킹에 대한 대비책이므로 본질적의미에서 Session Fixation에 대한 대비책은 아니다.)


 어플리케이션에 따라서는 신규세션 발행시에 기존의 세션스코프의 데이터를 이전해야 할 수도 있다. 그런 경우 이전할 데이터와 버려야할 데이터의 관리에 주의하여야 또다른 보안상 취약점이 생기는 것을 방지할 수 있을 것이다.




※본 포스트의 내용은 해킹을 조장하기위해 쓰여진 글이 아닙니다. 위의 내용을 악용할 경우 처벌받을 수도 있으므로 내용을 이해하고 방어할 목적으로만 이용하시길 당부합니다.



Posted by Reiphiel