28. 쿠키 변조 취약점
■ 개요
- 웹 어플리케이션 운영 시 사용자 인증 방식 중 하나인 쿠키를 공격자가 변조하여 다른 사용자로 전환하거나 권한 상승이 가능한 취약점으로 클라이언트에 전달되는 쿠키에 사용자 식별 값이 평문으로 노출될 경우 쿠키 변조를 통해 다른 사용자의 유효한 세션 탈취등이 가능하다.
- 웹 취약점 점검 과정에서 보통 테스트 계정을 두개 발급 후, 쿠키 재 사용 가능 여부를 체크
- 주요정보통신기반시설 취약점 진단 기준으로 28. 쿠키 변조에 해당
- OWASP TOP 10 2021 A01. Broken Access Control에 해당
■ 쿠키 vs 세션 차이
□ 쿠키 정의 및 특징
- 쿠키(Cookie)란 인터넷 사용자가 어떠한 웹사이트를 방문할 경우 사용자의 웹 브라우저를 통해 인터넷 사용자의 컴퓨터나 다른 기기에 설치되는 작은 기록 정보 파일을 일컫는다.
- 사용자 인증 유효한 시간을 명시할 수 있으며, 유효 시간이 정해지면 브라우저가 종료되어도 인증이 유지된다는 특징
- 클라이언트 상태정보를 로컬(브라우저)에 저장 후 참조
- 사용자가 따로 요청하지 않아도 브라우저가 Request시에 Request Header를 넣어서 자동으로 서버에 전송
□ 세션 정의 및 특징
- 세션(Session)이란 일정 시간 동안 같은 사용자(브라우저)로부터 들어오는 일련의 요구를 하나의 상태로 보고 그 상태를 일정하게 유지시키는 기술이다.
- 서버에서는 클라이언트를 구분하기 위해 세션ID를 부여하여 웹 브라우저가 서버에 접속해서 브라우저를 종료할 때까지 인증상태 유지
- 사용자에 대한 정보를 서버에 두기 때문에 쿠키보다 보안에 좋지만 사용자가 많아질수록 메모리 많이 차지
□ 쿠키 VS 세션 비교 표
쿠키(Cookie) | 세션(Session) | |
저장위치 | 클라이언트 로컬 (브라우저/ 개인컴퓨터) | 서버(웹사이트) |
보안 | 취약 | 강함 |
라이프 사이클 |
브라우저 종료해도 만료시점 지나지 않으면 삭제 X | 브라우저 종료되면 삭제 |
속도 | 빠름 | 느림 |
저장형식 | Text | Object |
□ 참조 사이트
세션 vs 쿠키 vs 캐시 차이점
ABTCEFG 안녕하세요 여러분! BTC_주먹쥐고 일어서 입니다. IaC로 넘어가기전 기초 탄탄 인프라를 잡는 시간입니다. 다들 IT 멱살 잡고 한걸음 더 나아가 봅시다! 세션 vs 쿠키 vs 캐시 HTTP(상태 비저장
btcd.tistory.com
■ 쿠키 변조 실습 환경
- Kali Linux
- Bee box
- Portswigger Web Academy
※ 쿠키 변조 실습 전 테스트 계정 2개 필요
■ 쿠키 변조 실습1
Step 1) 일반 계정(user1)으로 Bee box(A2 Session Mgmt - Cookies(HTTPOnly))로 접근 후, 쿠키값을 확인하는 버튼을 클릭 후 burp suite으로 확인 시, 'httponly' 옵션이 없는 것으로 확인
Step 2) 'httponly' 설정이 없으면, XSS 공격을 통해 자바스크립트를 사용하여 상대방의 쿠키 값을 알아낼 수 있다.
이번 실습에는 XSS 공격을 통해 쿠키 재사용 실습까지는 진행하지 않고 추후에 다른 Chapter로 보여줄 예정이며, 공격자가 쿠키값을 스니핑 하고 있다는 가정하에 진행할 예정.
공격자(user1)이 희생자(bee)의 쿠키값을 확인하여 burp suite을 통해 희생자의 쿠키값으로 변조 후 forwarding 진행 시, 희생자 계정으로 접근 가능 확인
■ 쿠키 변조 실습2
Step 1) PortSwigger web academy Lab 접근 시 메인 페이지가 뜨며, 페이지 소스 코드 내 관리자 권한일 시 수행할 수 있는 기능을 나타낸 코드를 확인 및 관리자 페이지로 보이는 경로 확인.
Step 2) Lab에서 제공해준 계정으로 로그인 후 다시 '/admin' 경로로 접근했을 때에도 동일한 문구가 뜨는 것으로 추측했을 때, 관리자 계정이 아닌 것으로 추측. burp suite를 사용하여 '/admin' 경로로 접근하는 것을 캡쳐했을 때, 쿠키 값이 'Admin=false'으로 설정되어 있는 것을 확인. false를 true로 변경하여 포워딩 진행 시, 관리자 페이지 정상 접근 확인.
■ 대응 방안
1. 쿠키 대신 보안성이 강한 Server Side Session 방식 사용.
2. 쿠키 또는 세션을 사용해서 중요 정보나 인증을 구현할 경우 안전한 알고리즘(SEED, AES 등) 적용
3. 쿠키를 사용할 경우, 쿠키 만료 시간, httpOnly, secure 설정을 사용
from django.http import HttpResponse
def remind_user_state(request):
res = HttpResponse()
# 쿠키의 만료시간을 적절하게 부여하고 secure 및 httpOnly 옵션을 활성화 한다.
res.set_cookie('rememberme', 1, max_age=60*60, secure=True, httponly=True)
return res