본문 바로가기

웹 해킹

[주통기반] 로컬 웹 서버 취약점 찾기 (세션 고정)

세션 고정 취약점은 사용자에게 항상 똑같은 세션 아이디를 발급하는 취약점으로 로그인 실행 전과 실행 후에 같은 세션 아이디가 발급될 경우 위험이 발생할 수 있습니다. 

만약 로그인 전과 후의 세션 아이디가 같다면 로그인 하기 전에 탈취 당한 세션 아이디를 공격자가 가지고 있다가 피해자가 인증을 진행한다면 세션 아이디는 고정되어 있기 때문에 전에 탈취한 세션을 통해 인증을 우회할 수 있습니다.

 

점검 방법 : 로그인 시도마다 기존 세션 아이디는 파기하고 새로운 세션 아이디를 발급하는지 확인합니다.

 

1. 로그인

1) 로그인 전에 발급 받은 세션 아이디를 확인합니다.

인증 전 세션 아이디 확인

 

2) 로그인 후 세션 아이디를 확인합니다.

인증 후 세션 아이디 확인

 

[공격 시나리오]

위에 설명한 공격 시나리오 이해를 돕기위해 실습해보겠습니다.

 

피해자의 전에 사용한 세션 아이디가 탈취당했을 때 공격자가 해당 세션 아이디로 자신의 세션아이디를 바꿔 놓습니다.

공격자 세션아이디

 

피해자 세션아이디

 

이제 피해자가 만약 로그인을 시도했을 경우 확인해보겠습니다.

인증 후 동일한 세션아이디

 

피해자 계정으로 인증 우회 성공

 

같은 사진 같지만 다른 브라우저에서 실시 했으며, 인증 후 동일한 세션아이디가 발급되어 원래 인증이 되지 않은 세션아이디였음에도 해당 세션아이디로 인증을 우회할 수 있습니다.

 

[대응 방안]

로그인 후 기존 세션 아이디는 파기하고 예측 불가능한 새로운 세션 아이디를 발급하는 로직을 구현합니다.

    session_regenerate_id();
    setAuthSession($user);
    echo "로그인 성공 $enteredId";
    header('location: index.php');

 

비밀번호가 일치하면 위와 같이 session_regenerate_id() 를 사용하여 세션을 재발급합니다.

옵션으로 delete_old_session을 사용하면 기존의 세션을 삭제 할 수 있습니다.

session_regenerate_id( bool $delete_old_session = false) 기본 함수 형식입니다.

인증 정보를 세션에 저장하기전에 세션 아이디를 바꾸어 기존 세션에는 인증 정보가 저장되지 않도록 합니다.

 

1) 로그인 페이지에 접속합니다.

세션 아이디 확인

 

 

2) 로그인을 진행 후 세션아이디를 확인합니다.

세션아이디 확인

 

로그인 후 세션 아이디가 재발급되어 아이디가 변경된 것을 확인할 수 있습니다.

 

3) 로그아웃

로그아웃 후 세션아이디 확인

 

로그아웃 시에도 새로운 기존 세션을 파기하면서 새로운 세션 아이디를 발급했습니다.

 

[적용 확인]

1) 로그인 전 이용자의 세션 아이디를 확인합니다.

이용자 세션 아이디

 

2) 공격자 세션아이디를 확인 후 이용자의 세션아이디로 변경합니다.

공격자 세션 아이디
세션 아이디 변경

 

3) 이용자가 로그인을 합니다.

이용자 로그인

 

4) 공격자가 이전의 세션아이디를 통해 인증 우회 시도를 합니다.

인증 우회 시도

 

하지만 기존의 세션아이디가 아닌 새로 발급받은 세션아이디에 인증된 사실이 저장되어 있어 로그인 우회에 실패한 것을 확인할 수 있습니다.

 

세션 고정 취약점은 이렇게 인증 전 후에 동일한 세션을 사용하여 한번의 세션 탈취로 해당 계정으로 계속 접근이 가능해집니다.

로그인 시도 때마다 새로운 세션아이디를 발급해주며 기존 세션은 파기하여 인증을 우회할 수 없도록 합니다.