320x100

Cookie

용도

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

 

쿠키에는 인증 상태를 나타내는 민감한 정보가 보관되며, 브라우저 내부에 저장됩니다. 그리고 브라우저가 웹 서비스에 접속할 때 브라우저는 자동으로 쿠키를 헤더에 포함시켜 요청을 보냅니다. 이 덕분에 우리는 포털 사이트, SNS와 같은 웹 서비스에 한 번 로그인한 후 일정 기간은 로그인하지 않고도 바로 서비스를 사용할 수 있습니다.

정보기록

예를들어, 웹 서비스 사용 시 등장하는 팝업 창 "다시보지않기" 또는 "7일 동안 보지않기" 버튼 등이 있다. 이러한 버튼을 클릭하면 웹 서버는 자동으로 클라이언트의 팝업 옵션을 기록하기 위해 쿠키에 해당 정보를 기억하고 쿠키를 통해 팝업 창의 표시 여부를 판단합니다.

 

쿠키는 서버와 통신할 때마다 전송이 되기 때문에 리소스 용량을 많이 차지 하는 경향이 있다. 이를 보완하기 위해 최근에는 Modern Storage APIs를 통해 데이터를 저장하는 방식을 권장하고 있습니다.

 

상태정보

많은 웹 사이트에서는 회원 가입과 로그인을 통해 개개인에게 맞춤형 서비스를 제공합니다. 웹 서버에서는 수많은 클라이언트의 로그인 상태와 이용자를 구별해야 하는데, 이때 클라이언트를 식별할 수 있는 값을 쿠키에 저장해 사용합니다.

 

쿠키 변조

쿠키는 클라이언트의 브라우저에 저장되고 요청에 포함되는 정보입니다. 악의적인 클라이언트는 쿠키 정보를 변조해 서버에 요청을 보낼 수 있습니다. 만약 서버가 별다른 검증 없이 쿠키를 통해 이용자의 인증 정보를 식별한다면 공격자가 타 이용자를 사칭해 정보를 탈취할 수 있습니다.

 

취약점 분석

@app.route('/') # / 페이지 라우팅 
def index():
    username = request.cookies.get('username', None) # 이용자가 전송한 쿠키의 username 입력값을 가져옴
    if username: # username 입력값이 존재하는 경우
        return render_template('index.html', text=f'Hello {username}, {"flag is " + FLAG if username == "admin" else "you are not admin"}') # "admin"인 경우 FLAG 출력, 아닌 경우 "you are not admin" 출력
    return render_template('index.html')

 

본 문제를 해결하기 위해서는 쿠키에 존재하는 username을 "admin" 문자열로 조작해야 합니다. 웹 브라우저의 개발자 도구를 사용하면 쿠키의 정보를 확인하거나 수정할 수 있습니다

 

username을 "admin"으로 변경해 서버에 요청하면 FLAG를 획득할 수 있습니다.


Session

웹 통신에서도 클라이언트가 쿠키를 변조해 서버에 요청을 보낼 수 있습니다. 따라서, 쿠키에 인증 상태를 저장하지만 클라이언트가 인증 정보를 변조할 수 없게 하기 위해 세션(Session)을 사용합니다.

 

 세션은 인증 정보를 서버에 저장하고 해당 데이터에 접근할 수 있는 키(유추할 수 없는 랜덤한 문자열)를 만들어 클라이언트에 전달하는 방식으로 작동합니다. 해당 키를 일반적으로 Session ID라고 합니다. 브라우저는 해당 키를 쿠키에 저장하고 이후에 HTTP 요청을 보낼 때 사용합니다. 서버는 요청에 포함된 키에 해당하는 데이터를 가져와 인증 상태를 확인합니다.

 

연습

원하는 웹페이지에 로그인을 한 이후, 

마우스 오른쪽 클릭을 하여 Inspect -> Application -> Cookies 에 들어가서 sessionID를 확인할 수 있습니다.

 

 

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

 

sessionid 를 우클릭을 통해 delete하고 새로고침을 하면 웹페이지의 로그인이 풀려 있는 것을 확인 할 수 있습니다.

 

쿠키의 빈 칸을 더블 클릭해 sessionid 헤더를 추가하고, 이전에 복사한 세션 값을 입력하면 브라우저의 쿠키에 세션 값이 설정됩니다. 세션 값을 설정하고 드림핵 페이지를 새로고침하면 로그인이 되는 것을 확인할 수 있습니다.

 

 

쿠키에는 여러분의 세션 정보가 저장되어 있고 서버는 이를 통해 이용자 식별하고 인증을 처리합니다. 공격자가 이용자의 쿠키를 훔칠 수 있으면 세션에 해당하는 이용자의 인증 상태를 훔칠 수 있는데, 이를 세션 하이재킹 (Session Hijacking)이라고 합니다.

 

키워드

  • Connectionless: 하나의 요청에 하나의 응답을 한 후 연결을 종료하는 것을 의미합니다.
  • Stateless: 통신이 끝난 후 상태 정보를 저장하지 않는 것을 의미합니다.
  • 쿠키 (Cookie): HTTP에서 상태를 유지하기 위해 사용하는 Key-Value 형태의 값
  • 세션 (Session): 쿠키에 포함된 Session ID를 사용해 서버에 저장된 세션 데이터에 접근하는 방식
  • 세션 하이재킹 (Session Hijacking): 타 이용자의 쿠키를 훔쳐 인증 정보를 획득하는 공격

 

 

dreamhack web hacking 강의를 기반으로 작성되었습니다.
300x250

+ Recent posts