본문 바로가기

Attack Method

Cookie Sandwich

반응형

이번엔 Cookie Sandwich에 대해 다뤄볼 거다.

해당 내용은 https://blog.snoopbees.com/http-cookie-sandwich-attack-6ba8110e0e02 에 있는 내용을 참고했다.

 

Cookie Sandwich가 무엇인지 알기 전에 먼저 Cookie가 뭔지 알아야한다.

원래는 Cookie Tossing 글에서 이걸 먼저 다뤘어야 하지만.. 까먹고 못 했다 ^_^

그래서 이 글에서 간단히 Cookie가 무엇인지 설명할 거다.

(잠깐 간단히 말하면 Cookie Sandwich로 HttpOnly 속성이 설정된 쿠키 값을 탈취할 수 있다.)

 

Cookie란

Cookie는 Server가 사용자의 Web browser에 저장하도록하는 작은 데이터 조각이다.

Browser는 이 데이터를 저장해뒀다가 동일한 서버에 다시 Request를 보낼 때마다 같이 전송한다.

 

그렇다면 왜 쿠키가 필요할까? 바로 HTTP 통신이 Stateless라는 특징을 가지고 있기 때문이다.

Stateless란 각각의 요청을 완전히 독립적인 것으로 취급하여, 서버가 클라이언트의 이전 상태를 기억하지 못하는 것을 의미한다.

 

그래서 매 요청시 사용자의 정보 등을 함께 보내서 사용자의 정보를 기억하는 것처럼 보이게 하는 것이다.

 

Cookie Attribute

여기서 설명해야할 Cookie 속성은 2025.08.22 - [Attack Method] - Cookie Tossing

 

Cookie Tossing

이 글에서는 Cookie Tossing에 대해 설명한다.해당 내용은 https://labs.snyk.io/resources/hijacking-oauth-flows-via-cookie-tossing/ 블로그를 참고했다.Cookie Tossing이란Cookie Tossing이란 공격자가 웹사이트의 하위 도메

imymin.tistory.com

여기서 설명했으니 건너뛴다.

 

Cookie Sandwich란

이제 이 글의 핵심 내용인 Cookie Sandwich에 대해 소개할 것이다.

Cookie Sandwich란 이름 그대로 쿠키를 샌드위치처럼 한 쿠키를 다른 쿠키 사이에 끼워 넣어 쿠키 값을 탈취하는 공격 방법이다.

 

Cookie Sandwich의 핵심은 서버와 브라우저가 쿠키를 해석하는 방식이 다르다는 점을 이용하는 것이다.

최신 브라우저에서는 RFC 2109를 지원하지 않지만 몇몇 웹 서버는 RFC 2109를 지원하는 경우가 있다.

이 두 차이를 이용하는 거다.

 

RFC 2109

RFC 2109는 HTTP 쿠키의 동작 방식을 정의한 기술 표준 문서이다.

(현재 최신 표준은 RFC 6265다)

 

RFC 2109에서는 쿠키의 값이 "(큰따옴표)로 감싸져 있을 때 이 큰따옴표 안에 있는 ;(세미콜론) 같은 특수 문자도 값의 일부로 취급했다.

그리고 RFC 2109에서는 쿠키가 어떤 버전을 따르는지 명시하기 위해 $Version=1; 처럼 $Version이라는 속성을 사용했다.

 

그럼 이걸 어떻게 이용할 수 있을까?

Cookie: $Version=1; param1="start; sessionID=비밀값; param2=end"

 

위와 같은 쿠키 들이 있다고 가정해보자. 그리고 sessionID에만 HttpOnly 속성이 설정이 되어있다.

(HttpOnly 속성이 설정이 되어 있으면 Javascript 단에서 쿠키를 읽을 수 없게 된다.)

 

위 쿠키를 브라우저는 $Version=1, param1=start, sessionID=비밀값, param2=end 라는 쿠키가 있구나라고 해석한다.

하지만 RFC 2109를 지원하는 웹 서버에서는 $Version=1을 보고 레거시 모드로 해석을 진행한다.

그래서 param1="start; sessionID=비밀값; param2=end"라는 param1이라는 쿠키 밖에 없구나라고 인식하게 된다.

 

그래서 RFC 2109를 지원하는 웹서버에서 위와 같이 쿠키 값이 있다면 Javascript로 param1 쿠키 값만 읽어도 HttpOnly 속성이 설정되어 있는 sessionID 쿠키 값을 읽을 수 있어서 탈취가 가능하다.

 

Cookie Sandwich 방법

위 예시에서 sessionID 값을 읽으려면 param1, param2처럼 읽으려고 하는 쿠키 앞, 뒤에 쿠키를 만들어서 보내야한다.

어떻게 할 수 있을까? 이건 Cookie Tossing 글에서처럼 path 속성을 이용하면 된다.

쿠키는 path 값이 더 구체적으로 적혀있는 것이 앞에 위치하여 전송된다.

 

이걸 이용해서 쿠키 순서를 정할 수 있다.

 

해당 페이지에 쿠키 값을 읽는 필드가 있고 XSS가 가능하다면 위 예시처럼 Cookie Sandwich를 실행할 수 있다.

(방법은 추후에 업데이트 예정)

 

Cookie Sandwich 방어 방법

Cookie Sandwich 방어 방법은 Cookie Tossing과 같다.

바로 Host 접두사를 이용하는 것이다.

 

Host 접두사를 이용하면 쿠키의 Path 속성의 값을 /로 밖에 설정을 못 한다.

Cookie Sandwich는 Path 속성의 동작 원리를 이용한 공격 기법이므로 Host 접두사를 이용하면 막을 수 있다.

 

하지만 이것 역시 Cookie Tossing에서 언급했지만 우회가 가능하다.

Host 접두사 우회 방법은 다음 글에서 다룰 예정이다.

 

반응형

'Attack Method' 카테고리의 다른 글

Cookie Tossing  (4) 2025.08.22