[Dreamhack] Exercise : Cookie
문제 풀이 : 2023.07.09(일)
※ 웹 프레임워크 : 웹 페이지를 개발하는 과정에서 겪는 유지보수, 반복 작업 등의 어려운을 줄이기 위해 명명 및 스크립트 작성 규칙 또는 디렉터리 구조 등이 명시도니 개발 표준 가이드를 정의하고, 개발자가 이에 맞춰 개발할 수 있도록 하는 것

해당 문제의 목표는 관리자 권한을 획득해 FLAG를 획득하는 것으로, 이 문제에서는 다음과 같은 페이지들을 제공합니다.
페이지 | 설명 |
/ | 이용자의 username을 출력하고 관리자 계정인지 확인할 수 있는 페이지 |
/login | username, password를 입력받고 로그인할 수 있는 페이지 |
웹 서비스 분석
엔드 포인트 : /

위 코드는 인덱스 페이지를 구성하는 코드로, 해당 페이지에서는 요청에 포함된 쿠키를 통해 이용자를 식별합니다. 만약 쿠키에 존재하는 username이 admin이면 FLAG를 출력할 수 있습니다.
엔드 포인트 : /login


위 코드는 로그인 페이지를 구성하는 코드로, 메서드에 따른 요청마다 다른 기능을 수행할 수 있습니다.
GET | POST |
username과 password를 입력할 수 있는 로그인 페이지를 제공함 | - 이용자가 입력한 usernamerhk password 입력값을 users 변수값과 비교함 - users 변수 선언은 users 변수가 선언된 코드로, guest 계정의 비밀번호는 guest, 관리자 계정의 비밀번호는 파일에서 읽어온 FLAG임 |
취약점 분석
전체적인 코드의 웹 서비스를 분석했으니 이제 취약점을 분석해보겠습니다.

" 엔드포인트 : / "에서 보여준 코드를 분석해보면 이용자의 계정을 나타내는 username 변수가 요청에 포함된 쿠키에 의해 결정되어 여기서 문제가 발생합니다. 쿠키는 클라이언트의 요청에 포함되는 정보로, 이용자가 임의로 조작할 수 있습니다. 서버는 별다른 검증 없이 이용자가 요청에 포함된 쿠키를 신뢰하고, 이용자 인증 정보를 식별하기 때문에 공격자는 쿠키에 타계정 정보를 삽입해 계정을 탈취할 수 있습니다.
>> username 변수에 저장된 쿠키로 인해 계정 탈취와 관련된 취약점이 존재하는 것을 알 수 있었습니다.
익스플로잇
위에 설명한 이론을 바탕으로 실습을 하면서 문제를 풀어보겠습니다.
cookie 문제에서 FLAG를 얻기 위해 쿠키에 존재하는 username을 admin 문자열로 조작해야 합니다.

위 그림과 같이 웹 브라우저의 개발자 도구에서 [ Application ] > [ Cookies ] 를 이용하면 쿠키의 정보를 확인하거나 수정할 수 있습니다.

쿠키 메뉴를 보기 전에 먼저 guest 계정으로 로그인하여 로그인 성공 시킨 후에 저장된 쿠키 값을 확인합니다. 로그인을 성공한 guest 쿠키 값에서 username을 admin으로 변경하고, 서버에 요청(새로고침)하면 아래 그림과 같이 FLAG을 찾을 수 있습니다.

Cookie 문제를 통해, 서버가 건증 없이 쿠키를 신뢰하고 인증 정보를 식별할 때 발생할 수 있는 문제점에 대해 알 수 있었습니다. 이론적으로 이해한 후, 실습을 하면서 해당 취약점을 이용하여 다른 계정의 권한을 획득할 수 있었습니다.
이러한 문제점을 Session을 사용해 해결할 수 있으며, 세션은 인증 정보를 서버에 저장하고, 랜덤한 키를 클라이언트에게 발급합니다. 클라이언트는 해당 키를 포함해 서버에게 요청하고, 서버는 저장한 세션 키와 대응하는 클라이언트인지 확인하므로 안전한 서비스를 구현할 수 있습니다.