BLOG ARTICLE cookie | 1 ARTICLE FOUND

  1. 2007/07/23 쿠키는 어떻게 조작되는가? (1)

웹보안 시리즈 2번째 포스팅 '쿠키 조작' 에 대한 이야기이다. 원래 하려던 이야기는 쿠키가 아닌데, FattyMarine 님의 답글도 있고 하니 조금만 더 써볼까 한다. 이미 다른 포스팅을 드래프트로 걸어 놨는데, 순서가 바뀌게 되었다. 이건 어떻게 풀어야할지...

네이버 백과사전에서 찾은 쿠키의 정의는 아래와 같다.

인터넷 웹사이트의 방문기록을 남겨 사용자와 웹사이트 사이를 매개해 주는 정보.

고객이 특정 홈페이지를 접속할 때 생성되는 정보를 담은 임시 파일로 크기는 4KB 이하로 작다. 쿠키는 애초 인터넷 사용자들의 홈페이지 접속을 돕기 위해 만들어졌다. 특정 사이트를 처음 방문하면 아이디와 비밀번호를 기록한 쿠키가 만들어지고 다음에 접속했을 때 별도 절차 없이 사이트에 빠르게 연결할 수 있다.

쿠키는 웹사이트에서 사용자 PC(웹브라우저)에 저장해 놓은 Data 이다. 필요에 의해 불러 쓰고, 또 저장하고.. 이 과정을 반복하면서 쿠키를 '활용' 한다.

우리가 웹브라우저에서 웹사이트에 접속하면 초기 HTML 페이지와 JS, CSS, 이미지 파일 등의 구성요소를 다운로드해서 페이지를 보여준다. 필요한 구성요소를 받기 위해 웹서버에 요청(Request) 할 때마다 Request Header 에 쿠키 정보를 함께 보낸다.

위 그림을 보면 알겠지만 사실 쿠키가 Request Header 의 거의 대부분을 차지하고 있다. 1KB 정도 크기의 쿠키를 사용하는 웹사이트를 방문하면 웹브라우저에서 이미지 파일을 하나 가져올 때마다 쿠키를 포함해서 약 2KB 정도의 용량을 웹서버에 업로드 해야 한다.  이 때문에 대용량 쿠키를 사용하면 사이트 로딩속도가 느려진다!

아래와 같은 쿠키 사용 프로세스를 가진 사이트가 있다고 가정해보자.

1. 처음 웹사이트에 접속하면 '비로그인' 상태이며 쿠키에는 아무런 내용이 없다.
2. 로그인 과정을 거치면서 사용자 쿠키에 로그인ID를 내려보낸다.
3. 사이트에서 클릭 할 때마다 쿠키에 담긴 로그인ID를 웹서버로 전송하고, 웹서버는 쿠키 값을 받아 로그인 상태로 해석한다.
4. 로그아웃 버튼을 누르면 쿠키를 삭제한다.

언뜻 보기에는 아무런 문제가 없어 보인다. 하지만, 이런 순서로 진행된다면 어떨까?

1. 웹사이트에 접속하자마자 비로그인 상태에서 로그인ID 쿠키를 강제로 셋팅한다.
2. 사이트에서 클릭 할 때마다 쿠키에 담긴 로그인ID를 웹서버로 전송하고, 웹서버는 쿠키 값을 받아 로그인 상태로 해석한다.
3. 로그아웃 버튼을 누르면 쿠키를 삭제한다.

웹서버는 헤더에 담긴 쿠키에서 로그인ID 값이 있는지 검사해서 로그인 상태인지 판단한다. 하지만 쿠키가 웹서버에서 셋팅했는지 사용자가 셋팅했는지에 대한 판단은 불가능하다. 그냥 쿠기 값이기 때문이다.

실제로 어떻게 동작하는지 확인해 보자.

모 사이트에 접속한 화면인데, 위와 같이 로그인창이 나온다.

javascript:alert("Cookies: "+document.cookie)

주소창에 위의 내용을 붙여 넣으면 현재 사이트의 쿠키 정보를 보여준다.

여기에서는 로그인 아이디 정보는 없다.

javascript:document.cookie='loginid=userid;path=/'

임의로 쿠키값을 셋팅하기 위해 웹브라우저 주소창에 위의 내용을 붙여 넣는다.

웹브라우저는 주소줄에 입력한 내용을 표시해준다. 뒤로 가기 버튼을 눌러 방금 전 화면으로 돌아가보면
(새로 고침이 필요한 경우도 있다)

이렇게 로그인 되어있다. 물론 쿠키가 암호화 되지 않았기 때문에 가능한 초보적인 실수이다.

Fiddler 와 같은 Proxy Tool 을 사용하면 웹브라우저와 관계 없이 내가 원하는 쿠키를 100% 조작할 수 있다.

static function OnBeforeRequest(oSession:Fiddler.Session)
{
    if (oSession.host == "image.auction.co.kr"){
       oSession.oRequest["Cookie"]="pcid=XXXX";
    }

}

위와 같은 Fiddler Rule 을 사용하면 image.auction.co.kr 에 접속할때는 pcid=XXXX 라는 쿠키만 전송한다.

실제로도 위와 같이 전송되었다. 위의 내용은 단순한 예이며, 마음 먹기에 따라 얼마든지 원하는 내용으로 수정해서 웹서버를 속일 수 있다.

쿠키는 웹서버에서 세션으로 처리해야 하는 일을 대신해 준다. 서버 여러 대를 동시에 운영하는 로드밸런싱 환경에서 세션 공유와 같은 처리하기 어려운 문제도 쉽게 해결해 준다. 하지만 보안 마인드 없이 사용하면 허점을 노출하게 되며, 아무리 작은 허점이라도 비지니스에 치명적인 위협이 될 수 있음을 알아야 한다.

이올린에 북마크하기(0) 이올린에 추천하기(0)