본문 바로가기

카테고리 없음

Dreamhack 웹 해킹 공부하기 (쿠키 & 세션)

우리는 웹 서버가 클라이언트와 HTTP 프로토콜을 사용하여 통신한다는 것은 알았으며, 웹 서버는 수많은 클라이언트와 통신을 할 것이다.

그러면 이 때 웹 서버는 많은 클라이언트를 어떻게 구별하고 서로 다른 결과를 반환할까?

 

HTTP통신을 할때 웹 서버에 명령을 내리기 위해 메소드와 자원의 위치를 가르키는 URL이 포함 되어있다. (웹 브라우저 파트에 나옴) 이뿐만 아니라 클라이언트 정보와 요청의 내용을 구체화하는 등의 데이터, 클라이언트의 인정 정보가 있는 헤더도 같이 보내는 데 이 헤더를 통해 웹 서버는 결과 값을 반환한다. 

 

쿠키(Cookies)

 

클라이언트의 IP주소와 User-Agent는 매번 변경될 수 있으며 HTTP 프로토콜의 Conectionless와 Stateless 특징 때문에 웹서버는 클라이언트를 기억할 수 없다. 그렇기에 HTTP에서 상태를 유지하기 위해 쿠키(클라이언트의 정보 기록과 상태 정보 표현)가 생겼다.

 

- User-Agent: HTTP 요청을 보내는 디바이스와 브라우저 등 사용자 소프트웨어의 식별 정보를 담고 있는 request header의 한 종류이다.

- Conectionless: 하나의 요청에 하나의 응답을 한 후 연결을 종료는 특징이다. 그렇기에 요청시마다 새로운 연결을 시도해야한다.

- Stateless: 통신이 끝난 후 상태 정보를 저장하지 않는 특징이다. 그렇기에 이전 연결에서 사용한 데이터를 다른 연결에서 사용할 수 없다.

 

쿠키는 key와 value 쌍으로 서버가 클라이언트에 쿠키를 발급하면 클라이언트는 서버에 요청 시 쿠키를 같이 전송한다.

그러면 서버는 이 쿠키를 확인해 클라이언트를 구분한다.

쿠키 변조

쿠키는 클라이언트의 브라우저에 저장되며 요청에 포함되는 정보이다. 그렇기에 악의적인 클라이언트가 쿠키 정보를 변조해 서버에 요청을 보낼 수 있다.

세션(Session)

쿠키는 변조해 서버에 요청을 보낼 수 있기 때문에 서버에서 쿠키검증이 필요하다. 이때 쿠키 검증을 위해 세션을 사용한다. 

세션은 인증 정보를 서버에 저장하고 해당 데이터에 접근할 수 있는 키를 만들어 클라이언트에 전달한다.

- 이때 키는 유추할 수 없는 랜덤한 문자열이다.

해당 세션을 쿠키에 저장하고 이후에 HTTP요청을 보낼 때 사용한다.

>> 

1. A가 웹 서버에 자신임을 표시하는 쿠키를 포함하여 통신한다. 하지만 이때, 클라이언트가 보내는 쿠키를 무조건 신뢰하면 악의적인 사용자가 쿠키를 변조하여 A인척 통신할 수 있다.

2. 웹 서버는 클라이언트의 정보를 서버에 저장하고 이 정보에 접근하기위한 키를 만든다. 이 키는 유추할 수 없는 랜덤한 문자열이다.

3. 이 키를 A에게 보내어 다음 요청 시에 쿠키에 포함해서 보내라고 한다. 

4. A는 웹 서버와 통신할 때 이 키를 포함한 쿠키를 보내어 통신다.

악의적인 사용자가 이 키를 알아내면 A인척 통신할 수 있지만, 키는 유추할 수 없는 랜덤한 문자열이기에 알기 어렵다.

- 세션 하이재킹 공격이 있길래... 어렵다고 적음

 

쿠키는 이용자가 저장하며 세션은 서버가 저장한다.

 

쿠키는 이용자가 저장하기 때문에 저장된 쿠키를 조회, 수정, 추가할 수 있다. (개발자 도구 파트에서 볼수 있음)

 

쿠키 설정 방법

서버:  HTTP응답 중 헤더에 쿠키 설정 헤더(Set-Cookie)를 추가 -> 설정

클라이언트: document.cookie르 사용해 쿠키 설정

 

연습(세션 하이재킹)

공격자가 이용자의 쿠키를 훔칠 수 있으면 세션에서 해당하는 이용자 인증상태를 훔칠 수 있다.

 

Cookie의 문제점 (드림핵 예시)

엔드포인트: 서비스를 이용할 때 사용하는 커뮤니케이션 채널의 한쪽 끝에 해당하는 URI.

 

엔드포인트 분석

서버는 요청에 포함된 쿠키를 통해 이용자를 식별하며 메소드에 따른 요청마다 다른기능을 수행한다.

 

취약점 분석

쿠키는 클라이언트의 요청에 포함되는 정보로, 이용자가 임의로 조작할 수 있다. 서버는 별다른 검증 없이 이용자 요청에 포함된 쿠키를 신뢰하고, 이용자 인증 정보를 식별하기 때문에 공격자는 쿠키에 타계정 정보를 삽입해 게정을 탈취할 수 있다.

 

익스플로잇

위의 분석을 통해 쿠키의 value값을 수정하여 요청하면 해당 value의 인증상태를 훔칠 수 있다.

 

이러한 문제점은 세션을 사용해 해결할 수 있다. 세션은 인증정보를 서버에 저장하고 랜덤한 키를 클라이언트에게 발급한다. 클라이언트는 해당키를 포함해 서버에 요청하고 서버는 저장한 세션키와 대응하는 클라이언트인지 확인하므로 안전한 서비스를 구현할 수 있다.