쿠키
클라이언트의 IP 주소와 User-Agent는 매번 변경될 수 있는 고유하지 않은 정보일 뿐만 아니라, HTTP프로토콜의 COnnectionless와 Stateless특징 때문에 웹 서버는 클라이언트를 기억할 수 없습니다.
Connectionless, Stateless
Connectionless : 하나의 요청에 하나의 응답을 한 후 연결을 종료하는 것을 의미합니다. 특정 요청에 대한 연결은 이후의 요청과 이어지지 않고 새 요청이 있을 때 마다 항상 새로운 연결을 맺습니다.
Stateless : 통신이 끝난 후, 상태 정보를 저장하지 않는 것을 의미합니다. 이전 연결에서 사용한 데이터를 다른 연결에서 요구할 수 있습니다.
이러한 HTTP에서 상태를 유지하기 위해 쿠키가 탄생했습니다. 쿠키는 key와 value으로 이루어진 일종의 단위로, 서버가 클라이언트에게 발급하면, 클라이언트는 서버에 요청을 보낼 때 마다 쿠키를 같이 전송합니다. 서버는 클라이언트의 요청에 포함된 쿠키를 확인해 클라이언트를 구분할 수 있습니다.
쿠키 변조
쿠키는 클라이언트의 브라우저에 저장되고 요청에 포함되는 정보입니다. 따라서, 아래 예시처럼 악의적인 클라이언트는 쿠키 정보를 변조해 서버에 요청을 보낼 수 있습니다. 만약 서버가 별다른 검증 없이 쿠키를 통해 이용자의 인증 정보를 식별한다면 아래 그림과 같이 공격자가 타 이용자를 사칭해 정보를 탈취할 수 있습니다.
세션
크키에 인증 상태를 저장하지만 클라이언트가 인증 정보를 변조할 수 없게 하기 위해 세션을 사용합니다. 세션은 인증 정보를 서버에 저장하고 해당 데이터에 접근할 수 있는 키를 만들어 클라이언트에 전달하는 방식으로 작동합니다. 브라우저는 해당 키를 쿠키에 저장하고 이후에 HTTP요청을 보낼 떄 사용합니다. 서버는 요청에 포함된 키에 해당하는 데이터를 가져와 인증 상태를 확인합니다.
쿠키 적용법
쿠키는 서버와 클라이언트 둘 다 설정할 수 있습니다.
연습 : 드림핵 세션
여기 사이트에서 세션으로 로그인과 로그아웃이 되는 실습을 해 보도록 하겠습니다.
서버에서 set-cookie로 세션쿠키를 저장하는 것을 볼 수 있습니다. 이제 이를 Applciation탭에 들어가서 없애보게 된다면 당연히 로그아웃이 되겠죠? 그리고 다시 sessionid라는 쿠키를 넣고 저 값을 넣게 되면 제 계정에 로그인 되게 됩니다. 악용하지 마세요... 제 계정 바꿀겁니다.
쿠키에는 여러분의 세션 정보가 저장되어 있고 서버는 이를 통해 이용자를 식별하고 인증을 처리합니다. 공격자가 이용자의 쿠키를 훔칠 수 있으면 세션에 해당하는 이용자의 인증 상태를 훔칠 수 있는데, 이를 세션 하이재킹 (Session Hijacking)이라고 합니다.
Exercise: Cookie
이번에는 잘못된 쿠키의 설계로 밠랭할 수 있는 문제점을 다루는 드림팩 워게임 문제를 풀어보도록 하겠습니다.
본 문제의 서버는 파이썬 Flask 프레임워크를 통해 구현되었습니다. 웹 프레임워크는 웹 페이지를 개발하는 과정에서 겪는 유지보수, 반복 작업 등의 어려움을 줄이기 위해 명명 및 스크립트 작성 규칙 또는 디렉토리 구조 등이 명시된 개발 표준 가이드를 정의하고, 개발자가 이에 맞춰 개발할 수 있도록 합니다.
목표
해당 문제의 목표는 관리자 권한을 획득해 FLAG를 획득하는 것입니다. 문제에서는 두가지의 endpoint가 존재합니다.
웹 서비스 분석
엔드 포인트: /
Figure1은 인덱스 페이지를 구성하는 코드입니다. 해당 페이지에서는 요청에 포함된 쿠키를 통해 이용자를 식별합니다. 만약 쿠키에 존재하는 username이 "admin"일 경우 FLAG를 출력하게 됩니다.
엔드 포인트: /login
Figure2는 로그인 페이지를 구성하는 코드입니다, 메소드에 따른 요청마다 다른 기능을 수행하는 것을 알 수 있습니다.
GET
username, password를 입력할 수 있는 로그인 페이지를 제공.
POST
이용자가 입력한 username, password입력 값을 users변숫값과 비교합니다. Figure3은 users변수가 선언된 코드 입니다. 코드를 살펴보면, 손님 계정의 비밀번호는 "guest", 관리자 계정의 비밀번호는 파일에서 읽어온 FLAG임을 알 수 있습니다.
취약점 분석
Figure3을 살펴보면 이용자의 계정을 나타내는 username변수가 요청에 포함된 쿠키에 의해 결정되어 문제가 발생합니다. 쿠키는 클라이언트의 요청에 포함되는 정보로, 이용자가 임의로 조작할 수 있습니다. 서버는 별다른 검증 없이 이용자 요청에 포함된 쿠키를 신뢰하고, 이용자 인증 정보를 식별하기 때문에 공격자는 쿠키에 타 계정 정보를 삽입해 계정을 탈취할 수 있습니다.
익스플로잇
본 문제를 해결하기 위해서는 쿠키에 존재하는 username을 "admin"문자열로 조작해야 합니다.
username을 "admin"으로 변경해 서버에 요청하면 다음과 같이 FLAG를 획득할 수 있게 됩니다.
session-basic
간단한 session을 활용하는 워게임을 해보도록 하겠습니다.
서버에 초기에 admin을 위한 session을 랜덤하게 만드는데, 이게 session_storage라는 곳에 저장되어 있습니다. 근데 /admin엔드포인터에 session_storage를 반환하길래 뭐지? 하고 들어가 보았습니다.
그냥 저기 admin에 해당하는 session_id를 session_id에 넣고 새로고침하면 바로 FLAG가 나오게 됩니다.
'School > Security' 카테고리의 다른 글
[ Web Hacking ] - XSS (0) | 2022.05.27 |
---|---|
[ Web Hacking ] - Mitigation: Same Origin Policy (0) | 2022.05.27 |
[ Web Hacking ] - W31c0m3, w3b h4ck3rs! (0) | 2022.05.25 |
[ Security ] 비밀번호 단방향 암호화 (0) | 2022.05.23 |
[ Node.JS ] Express-Session과 암호화 (0) | 2022.05.23 |