Summary

Dreamhack 웹 해킹 트랙을 공부한 내용을 정리한 글입니다

 

Connectionless : 하나의 요청에 하나의 응답을 한 후 연결을 종료하는 것을 의미합니다

Stateless : 통신이 끝난 후 상태 정보를 저장하지 않는 것을 의미합니다

쿠키 : HTTP 에서 상태를 유지하기 위해 사용하는 Key Value 형태의 값

세션 : 쿠키에 포함된 Session ID 를 사용해 서버에 저장된 세션 데이터에 접근하는 방식

세션 하이재킹 : 타 이용자의 쿠키를 훔쳐 인증 정보를 획득하는 공격

쿠키

클라이언트의 IP 주소와 User - Agent 는 매번 변경될 수 있는 고유하지 않은 정보일 뿐만 아니라 , HTTP 프로토콜의 Connectionless 와 Stateless 특징 때문에 웹 서버는 클라이언트를 기억할 수 없습니다

 

HTTP 프로토콜 특징

Connectionless : 하나의 요청에 하나의 응답을 한 후 연결을 종료하는 것을 의미합니다

특정 요청에 대한 연결은 이후의 요청과 이어지지 않고 새 요청이 있을 때 마다 항상 새로운 연결을 맺습니다

Stateless : 통신이 끝난 후 상태 정보를 저장하지 않는 것을 의미합니다

이전 연결에서 사용한 데이터를 다른 연결에서 요구할 수 없습니다

 

Connectionless , Stateless 특성을 갖는 HTTP 에서 상태를 유지하기 위해 쿠키가 생겼습니다

쿠키는 Key 와 Value 로 이뤄진 일종의 단위로 서버가 클라이언트에게 쿠키를 발급하면 클라이언트는 서버에 요청을 보낼 때마다 쿠키를 같이 전송합니다

 

서버는 클라이언트의 요청에 포함된 쿠키를 확인해 클라이언트를 구분할 수 있습니다

용도

일반적으로는 쿠키는 클라이언트의 정보 기록과 상태 정보를 표현하는 용도로 사용합니다

정보 기록

웹 서비스 사용 시 종종 등장하는 팝업 창에 다시 보지 않기 , 7 일 간 표시하지 않기 버튼이 있는 것을 확인할 수 있습니다

 

웹 서버는 각 클라이언트의 팝업 옵션을 기억하기 위해 쿠키에 해당 정보를 기록하고 쿠키를 통해 팝업 창 표시 여부를 판단합니다 과거에는 클라이언트의 정보를 저장하기 위해 쿠키가 종종 사용됐습니다

 

쿠키는 서버와 통신할 때마다 전송되기 때문에 쿠키가 필요 없는 요청을 보낼 때 리소스 낭비가 발생할 수 있습니다

최근에는 이러한 단점을 보완하기 위해 Moderm Storage APIs 를 통해 데이터를 저장하는 방식을 권장하고 있습니다

상태 정보

많은 웹 사이트에서는 회원 가입과 로그인을 통해 개개인에게 맞춤형 서비스를 제공합니다

웹 서버에서는 수많은 클라이언트의 로그인 상태와 이용자를 구별해야 하는데 , 이떄 클라이언트를 식별할 수 있는 값을 쿠키에 저장해 사용합니다

쿠키카 없는 통신

다음은 앞서 설명한 HTTP 통신의 특징을 간략하게 표현한 그림입니다

서버는 요청을 보낸 클라이언트가 누군지 알 수 없기 때문에 현재 어떤 클라이언트와 통신하는지 알 수 없습니다

쿠키가 있는 통신

다음은 쿠키를 사용해 HTTP 통신이 이뤄지는 과정을 간략하게 표현한 그림입니다

클라이언트는 서버에 요청을 보낼 때마다 쿠키를 포함하고 , 서버는 해당 쿠키를 통해 클라이언트를 식별합니다

쿠키 변조

중국집 식당에서 탕수육 이벤트를 쿠폰을 발행해 방문할 때 마다 도장을 찍어주는 방식으로 진행하고 있습니다

도장은 식당이 찍어주지만 쿠폰은 손님이 보관하기 때문에 손님은 쿠폰을 마음대로 할 수 있습니다

 

만약 나쁜 마음을 품은 손님이 식당에서 사용하는 도장과 비슷한 도장을 구해 직접 쿠폰에 가짜 도장을 찍게 된다면 식당에서 이를 구분할 방법이 없습니다

 

쿠키는 클라이언트의 브라우저에 저장되고 요청에 포함되는 정보입니다

따라서 아래 예시처럼 악의적인 클라이언트는 쿠키 정보를 변조해 서버에 요청을 보낼 수 있습니다

만약 서버가 별다른 검증 없이 쿠키를 통해 이용자의 인증 정보를 식별한다면 아래 그림과 같이 공격자가 타 이용자를 사칭해 정보를 탈취할 수 있습니다

세션

웹 통신에서 클라이언트가 쿠키를 변조해 서버에 요청을 보낼 수 있다는 것을 알았습니다

쿠키에 인증 상태를 저장하지만 클라이언트가 인증 정보를 변조할 수 없게 하기 위해 세션을 사용합니다

 

세션은 인증 정보를 서버에 저장하고 해당 데이터에 접근할 수 있는 키 ( 유추할 수 없는 랜덤한 문자열 ) 를 만들어 클라이언트에 전달하는 방식으로 작동합니다

 

해당 키를 일반적으로 Session ID 라고 합니다

브라우저는 해당 키를 쿠키에 저장하고 이후에 HTTP 요청을 보낼 때 사용합니다

 

중국집 식당의 탕수육 이벤트 쿠폰 도장을 조작하는 손님이 생겼습니다

손님이 갖고 있는 쿠폰은 손님이 조작할 수 있기 때문에 쿠폰에 도장을 찍지 않고 랜덤한 문자열을 적은 쿠폰을 주었습니다

 

손님이 쿠폰을 식당에 제시하면 식당에 보관중인 메모장에서 쿠폰에 적힌 문자열과 방문 횟수를 기록하는 방식으로 이벤트를 운영했습니다 이 때문에 손님은 쿠폰에 적힌 랜덤한 문자열은 조작할 수 있지만 매장에 기록된 방문 횟수는 조작할 수 없게 되었습니다

세션

쿠키는 데이터 자체를 이용자가 저장하며 세션은 서버가 저장한다는 핵심적인 차이가 있습니다

오른쪽의 모듈을 활용해 서버의 세션 저장소에 admin 인증 정보를 담고 있는 키를 갖고와 value 에 넣어봅니다

쿠키 적용법

앞에서 쿠키와 세션의 개념에 대해 배웠습니다

이제 쿠키의 특징과 함께 쿠키를 실제로 웹 페이지에 적용할 수 잇는 방법에 대해 알아보겠습니다

 

쿠키는 클라이언트에 저장되기 때문에 클라이언트는 저장된 쿠키를 조회 , 수정 , 추가할 수 있습니다

클라이언트가 서버에 요청을 보낼 때 저장된 쿠키를 요청 헤더에 넣어 전송하기 때문에 이용자가 요청을 보낼 때 쿠키 헤더를 변조할 수 있습니다

 

쿠키를 설정할 때에는 만료 시간을 지정할 수 있고 만료 시간 이후에는 클라이언트에서 쿠키가 삭제됩니다

쿠키의 만료는 클라이언트에서 관리됩니다

 

쿠키는 서버와 클라이언트 둘 다 설정할 수 있습니다

설정하는 방법은 아래와 같습니다

 

서버

HTTP 응답 중 헤더에 쿠키 설정 헤더를 추가하면 클라이언트의 브라우저가 쿠키를 설정합니다

HTTP/1.1 200 OK
Server: Apache/2.4.29 (Ubuntu)
Set-Cookie: name=test;
Set-Cookie: age=30; Expires=Fri, 30 Sep 2022 14:54:50 GMT;
...

클라이언트

자바스크립트를 사용해 쿠키를 설정합니다

document.cookie = "name=test;"
document.cookie = "age=30; Expires=Fri, 30 Sep 2022 14:54:50 GMT;"
document.cookie

크롬 Console 에서 위 구문을 통해 쿠키를 확인할 수 있습니다

크롬 Application 탭을 누르고 Cookies 를 통해 쿠키를 확인할 수 있습니다

연습: 드림핵 세션

1. 드림핵 로그인 페이지에서 우클릭 후 검사를 클릭하고 Network 탭을 누릅니다

Preserve log 를 체크하고 로그인을 하면 로그인 성공 시 응답을 볼 수 있습니다

응답을 살펴보면 서버에서 set - cookie 헤더를 통해 브라우저의 쿠키에 세션 정보를 저장하는 것을 볼 수 있습니다

2. 크롬 검사에서 Application 을 누르고 Cookies 목록 안의 https://dreamhack.io 를 누르면 서버의 set - cookie 헤더를 통해 설정된 쿠키를 확인할 수 있습니다

3. sessionid 헤더의 값을 메모장에 복사합니다

이후 사진과 같이 sessionid 헤더의 값을 우클릭한 후 Delete 를 클릭하면 브라우저의 쿠키에 저장된 세션 값이 삭제됩니다

세션 값을 삭제하고 드림핵 페이지를 새로고침하면 로그인이 풀려있는 것을 확인할 수 있습니다

4. 쿠키의 빈 칸을 더블 클릭해 sessionid 헤더를 추가하고 이전에 복사한 세션 값을 입력하면 브라우저의 쿠키에 세션 값이 설정됩니다

세션 값을 설정하고 드림핵 페이지를 새로고침하면 로그인이 되는 것을 확인할 수 있습니다

 

쿠키에는 여러분의 세션 정보가 저장되어 있고 서버는 이를 통해 이용자 식별하고 인증을 처리합니다

공격자가 이용자의 쿠키를 훔칠 수 있으면 세션에 해당하는 이용자의 인증 상태를 훔칠 수 있는데 이를 세션 하이재킹 ( Session Hijacking ) 이라고 합니다

Quiz

1. 서버

2. Stateless

3. 클라이언트