Everything is hacked.

There is no 100 % security.

Training/BugBountyClub

Cookie & Session

Kai_HT 2023. 8. 31. 17:11

Cookie - 쿠키 :

하이퍼 텍스트 기록서의 일종으로 인터넷 사용자가 특정 웹 사이트 방문 시 해당 사이트가 사용하고 있는 서버를 통해 인터넷 사용자의 컴퓨터에 설치되는 작은 기록 정보 파일을 정의. HTTP 쿠키, 웹 쿠키, 브라우저 쿠키 라고도 한다.

쿠키는 특정 사이트 이용자가 사이트 방문 시 클라이언트 단에 저장되는 key=value 쌍의 문자열로 구성되는 임시 파일이다. 웹 브라우저는 동일 서버에서 재 요청이 발생하는 경우 저장된 쿠키 데이터를 Cookie 요청 헤더에 포함시켜 전송한다.

HTTP 프로토콜은 Stateless - 비상태성 특성으로 인해 클라이언트 단 요청이 연속적으로 이루어지므로 동일 사용자 요청 여부 식별이나 웹 사이트 내 사용자 상태의 기억을 위해 만들어졌다. 쿠키의 경우 민감하지 않지만 서비스 제공에 필요한 데이터를 쿠키로 설정하여 사용되나 페이지 사용자 인증에도 사용되고 있어 공격자의 표적이 되기도 한다.

쿠키  목적

쿠키를 사용하는 목적은 웹 사이트마다 상이하나 일반적으로 사용자의 상태 데이터를 기억하여 해당 목적 달성을 위해 사용된다.

세션 관리 : 웹 사이트 내 사용자를 식별하고 사용자의 로그인 정보를 기억
개인화 : 사용자 별 맞춤 광고 및 웹 사이트 내 환경 설정 등 사용자 웹 사이트 환경을 개인화
사용자 활동 추적 : 사용자 웹 사이트 사용 패턴 및 검색 습관 추적, 분석하여 사용자 선호 타 컨텐츠 제안

쿠키 유형

쿠키는 "라이프 사이클" 관점으로 두 가지 유형이 존재한다.

Session Cookie : 사용자가 웹 사이트 방문 시간동안 메모리에 저장되는 쿠키. 임시쿠키 및 In-Memory 쿠키 라고도 한다. 사용자가 브라우저 종료 시 삭제되며 별도의 만료일자나 유효기간이 설정되지 않은 경우 쿠키가 세션 쿠키로 간주
Persistent Cookie : 서버에 의해 만료 시간 (Expires 속성) 이나 유효기간 (Max-Age 속성)이 설정된 쿠키. 사용자의 하드디스크 내 저장. 브라우저 종료 시 삭제되지 않으며 기간이 만료될 경우 삭제됨.

쿠키 발급

쿠키는 클라이언트 HTTP 요청에 대한 서버 응답 회신 시 Set-Cookie 응답 헤더를 통해 발급된다.

Set-Cookie: Cookie-name=Some-Value;

쿠키 속성

  • Expires : 쿠키 유효시간 설정. 날짜 시간 시간선; ~초 동안 유효하다.
Set-Cookie: Cookie-name=Some-value; expires=Wed, 31-Oct-2023 05:56:24 GMT; Max-Age=1200;
  • Domain : 브라우저에 의해 쿠키가 전송될 도메인을 결정한다. 해당 속성은 쿠키 발급 최상위 도메인과 하위 도메인만 설정이 가능하다. 해당 속성을 특정 도메인으로 설정 시 모든 하위 도메인에 대한 요청도 동일하게 쿠키를 전달한다. 해당 속성이 지정되지 않는 경우 요청 리소스 존재 도메인으로 간주되며 이 때 하위 도메인은 포함되지 않는다.
Set-Cookie: Cookie-name=Some-Value; Domain=redsec.kaiht.xyz;
  • Path : 브라우저 쿠키 전달 시 URL 경로를 결정한다. 요청된 리소스가 있는 도메인의 특정 경로나 해당 하위 경로로 요청 시에만 쿠키를 전달한다.
Set-Cookie: Cookie-name=Some-Value; Path=/pentatest;
  • Secure : HTTPS 를 통한 암호화 연결에만 쿠키 전송이 가능하며 특정 값을 가지지 않는다.
Set-Cookie: Cookie-name=Some-Value; Secure;
  • HttpOnly : 클라이언트 단에서 자바스크립트를 통해 쿠키 (document.cookie) 에 접근할 수 없게하며 별도의 값을 갖지 않는다. XSS (Cross Site Scripting) 공격의 완화 수단으로 사용된다.
    ※ 해당 옵션이 있다고 해서 XSS 공격이 차단되었다 판단하지 않아야한다. 브라우저가 document.cookie 값에서 HttpOnly 가 체크된 값에 대한 자바스크립트 접근을 차단하나 스크립트 자체 실행은 가능하기 때문이다.
Set-Cookie: Cookie-name=Some-Value; HttpOnly;
  • SameSite : 크로스 도메인을 통한 요청에 쿠키를 포함 여부를 결정한다. 설정 값으로 Lax, Strict, None 이 존재하며 Lax 의 경우 크로스 도메인도 GET 요청인 경우 쿠키 값을 전달할 수 있게하며 Strict 는 본인에게 발생한 요청인 경우 전달하며 마지막으로 None 의 경우 모든 요청에서 쿠키를 전달할 수 있게한다. 해당 속성은 CSRF (Cross Site Request Forgery) 공격의 완화수단 으로 사용된다.
    ※ 해당 옵션이 존재하나 XSS (스크립트 실행) 이 가능한 경우, 스크립트 내 공격 코드로 인한 스크립트 실행이 가능하기 때문이다.
Set-Cookie: Cookie-name=Some-value; SameSite=Strict;

해당 옵션들은 여러 속성을 나열하여 함께 설정이 가능하다.

1. 서버에서 웹 애플리케이션 동작에 따라 Set-Cookie 응답 헤더 내 쿠키를 발급하여 클라이언트에 전달한다.
2. 클라이언트는 Set-Cookie 응답 헤더를 참조하여 해당 값을 메모리에 저장하고 추가 요청이 발생하는 경우 저장된 쿠키 내 해당 값을 참고하여 서버로 해당 요청을 전달한다.
3. 해당 서버는 클라이언트 단의 요청 헤더를 확인하여 헤더 내 해당 값이 존재하는 경우 요청을 처리하여 클라이언트에 응답 값을 전달한다.

HTTP 연결의 HTTP의 비연결성 및 비상태성 특징을 가지고 있으므로 서버간 연결이 유지되지 않고 종료되며 해당 요청 응답 이후 서버는 발생하는 요청이 해당 클라이언트에서 받은 요청인지 판단할 수 없으나, 쿠키 값 존재 시 이전 요청 클라이언트와 동일한 클라이언트가 전달한 요청인지 판단이 가능하다. 

그러나 쿠키 값은 클라이언트 단에 저장이되므로 해당 쿠키 값을 변조하여 전달하는 경우 다른 요청 값으로 서버가 판단이 가능하므로 검증된 인증 방법이 필요한 경우 세션과 쿠키를 결합하여 세션 기반의 사용자 인증을 구현한다.


Session - 세션 :

일정시간 동안 사용자 (클라이언트)와 서버 간 연결을 유지해주는 기술.
세션을 통해 웹 사이트는 사이트 활동에 따라 상태확인 및 기억이 가능하며 상태 데이터를 저장하고 추적할 수 있다.

세션은 상태 데이터를 저장하고 추적할 수 있다는 면에서 쿠키와 비슷하나 세션은 클라이언트 단에 저장되지 않고 서버 단에 저장되고 관리된다 라는 차이가 존재한다.

세션 상태 관리

세션을 이용하여 서버가 사용자의 상태 정보를 유지하기 위한 기술은 세 가지다.

  • Cookie : 대부분의 웹 사이트는 세션 토큰을 저장하기 위해 쿠키 값을 사용하며, 추가적인 쿠키 속성을 사용하여 상대적으로 안전한 구현이 가능하다. 서버의 클라이언트 요청 시 Cookie 요청 헤더를 통해 전달하는 세션 토큰을 활용하여 세션 상태 유지가 가능하다.
  • Hidden Form Field : 클라이언트에 전달될 HTML 폼 내 숨겨진 필드 - Hidden Field에 서버가 세션 토큰을 동적으로 포함시킨다. 이때 클라리언트는 해당 폼 제출 시 서버로 다시 전달하게 된다.
  • URL Rewritte : 클라이언트에서 요청되는 URL 내 고유 세션 토큰을 동적으로 포함시킨다. 웹 사이트 내 포함되는 모든 a 태그의 href, form 태크의 action 속성이 들어갈 URL 에 고유한 세션 토큰을 포함시켜야한다.

세션 동작

1. 서버에서 클라이언트 요청 헤더 내 세션 토큰 여부 확인 후 해당 값이 미 존재 시 세션 토큰 생성 후 세션 토큰을 저장한다.  (인증된 세션) 클라이언트 - 웹 서버 간 세션이 수립되었다 한다.
이후 웹 애플리케이션 동작에 따라 Set-Cookie 응답 헤더 내 세션 토큰을 발급하여 클라이언트에 전달한다.
+ 비로그인 클라이언트와 익명 세션 수립이 가능하다.
2. 클라이언트는 Set-Cookie 응답 헤더를 참조하여 추가 요청이 발생하는 경우 저장된 세션토큰을 참고하여 서버로 해당 요청을 전달한다.
3. 해당 서버는 클라이언트 단의 요청 헤더를 확인하여 헤더 내 해당 값이 존재하는 경우 요청을 처리하여 클라이언트에 응답 값을 전달한다.
- 해당 사용자의 로그아웃 및 서버 설정으로 지정된 기간이 지나면 유지되던 세션은 자동으로 종료된다.

세션 안전성

세션은 쿠키와 다르게 서버에 저장되어 쿠키에 비해 상대적으로 안전하나 해당 세션 값이 공개적으로 노출되거나 예측이 가능한 경우 공격자가 노출된 토큰을 사용하거나 임의 대입 등으로 웹 사이트의 티켓 사용자 및 유효 세션을 가진 임의 사용자로 위장이 가능하다.

세션 관리 방법

예측 불가 세션 토큰

사용자에게 쿠키를 통해 발급되는 세션 토큰은 SHA256 등의 암호화 해시를 이용하여 길고 암호화 된 임의 문자열로 구성되어야한다. 길이는 최소 128bit 로 권장하고 있으며 충분한 무작위성이 보장, 최소 64bit 엔트로피 제공해야 한다.
- 세션 토큰은 사용자를 식별 및 추적하므로 사용자 간 중복되지 않고 고유해야한다.

암호화된 HTTPS 통신 사용

HTTP를 이용하는 경우 MITM (Man In The Middle) - 중간자 공격에 취약하므로 HTTPS 를 사용해야한다.

쿠키 보안 속성 설정

  • Domain & Path : 쿠키 전달 시 도메인 및 경로를 최대한 제한적으로 설정해야한다.
  • Secure : HTTPS 연결인 경우에만 쿠키를 전달할 수 있도록 설정이 필요하다. HTTP 연결에서 쿠키를 전달하게 될 경우 네트워크 트래픽 감청으로 세션 값이 노출될 수 있다.
  • HttpOnly : 스크립트를 통한 쿠키 접근이 불가할 수 있도록 해야한다.
  • Expire Max-Age : 해당 속성이 미설정되어 있는 경우 장기간 부재 중인 사용자의 세션을 이용한 악의적 행위, 세션 탈취 및 세션 재 사용 등으로 인한 타사용자로 부터의 피해, 공용 PC에서의 다음 사용자에 의한 침해 등이 가능하므로 설정 값을 이용하여 만료 기간을 설정하거나 (KISA 보안가이드 권장 타임아웃 시간 10분) 브라우저 종료 시 즉시 페기가 가능하도록 해야한다.
  • SameSite: 크로스 도메인 간 쿠키 값 전달이 불가능하도록 설정해야한다.

해당 글은 https://www.bugbountyclub.com/pentestgym 내 작성된 글을 정리한 포스팅 입니다.

'Training > BugBountyClub' 카테고리의 다른 글

Encoding  (0) 2023.09.14
Web & HTTP  (0) 2023.08.30