Dreamhack/Web Hacking

[Dreamhack] Exercise : Cookie

h00ddu 2023. 8. 13. 04:28

문제 풀이 : 2023.07.09(일)

 

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

 

Dreamhack 워게임 - cookie

 

해당 문제의 목표는 관리자 권한을 획득해 FLAG를 획득하는 것으로, 이 문제에서는 다음과 같은 페이지들을 제공합니다.

 

페이지설명
/이용자의 username을 출력하고 관리자 계정인지 확인할 수 있는 페이지
/loginusername, password를 입력받고 로그인할 수 있는 페이지

 

웹 서비스 분석

 
 

엔드 포인트 : /

 

< index 페이지 코드>

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

 


엔드 포인트 : /login

 

< users 변수 선언 코드 >
< login 페이지 코드 >

위 코드는 로그인 페이지를 구성하는 코드로, 메서드에 따른 요청마다 다른 기능을 수행할 수 있습니다.

 

GETPOST
username과 password를 입력할 수 있는 로그인 페이지를 제공함- 이용자가 입력한 usernamerhk password 입력값을 users 변수값과 비교함
- users 변수 선언은 users 변수가 선언된 코드로, guest 계정의 비밀번호는 guest, 관리자 계정의 비밀번호는 파일에서 읽어온 FLAG임

 

취약점 분석

 
 

전체적인 코드의 웹 서비스를 분석했으니 이제 취약점을 분석해보겠습니다.

< index 페이지 코드>

" 엔드포인트 : / "에서 보여준 코드를 분석해보면 이용자의 계정을 나타내는 username 변수가 요청에 포함된 쿠키에 의해 결정되어 여기서 문제가 발생합니다. 쿠키는 클라이언트의 요청에 포함되는 정보로, 이용자가 임의로 조작할 수 있습니다. 서버는 별다른 검증 없이 이용자가 요청에 포함된 쿠키를 신뢰하고, 이용자 인증 정보를 식별하기 때문에 공격자는 쿠키에 타계정 정보를 삽입해 계정을 탈취할 수 있습니다.

 

>> username 변수에 저장된 쿠키로 인해 계정 탈취와 관련된 취약점이 존재하는 것을 알 수 있었습니다.

 


 

익스플로잇

 
 

위에 설명한 이론을 바탕으로 실습을 하면서 문제를 풀어보겠습니다.
cookie 문제에서 FLAG를 얻기 위해 쿠키에 존재하는 username을 admin 문자열로 조작해야 합니다.

 

개발자 도구 단축키 [F12] > Application 상단바 클릭 > Cookies 메뉴 클릭

 

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

 

쿠키 메뉴에서 username을 guest에서 admin으로 변조

 

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

 

guest 계정의 쿠키 변조를 통한 admin 계정 로그인 성공

 

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