[웹해킹] DreamHack(새싹) - cookie

2024. 6. 12. 15:53IT공부/Hacking

반응형

1. 문제 설명

        ▶ 쿠키로 인증 상태를 관리하는 간단한 로그인 서비스

      ▶ admin 계정으로 로그인 성공 시 Flag 획득 !


2. 핵심 Point!

      ▶ "인증 상태를 쿠키로 관리" 한다는 것이 이번 문제의 핵심 Point !


3. 관련 지식 - 쿠키(cookie)

      ★ 간략 설명(상세 설명을 보고 싶으시다면 여기를 눌러주세요)

          우리가 웹사이트를 접속할 때, 페이지가 로드되면 사용자와 웹서버의 통신은 끝이 난다.

          웹서버가 접속하는 사용자의 정보를 다 기억해야한다면 엄청난 부담이 있기 때문이다.

          이러한 이유로 사용자가 웹서버에 인증을 하기 위해 로그인을 해도 다른 페이지로 넘어가면 로그인이 해제된다.

          그런데 말입니다... 우리가 실제로 웹사이트의 여러 페이지를 왔다리 갔다리 할 때, 로그인이 해제되는가?

          

          로그인이 풀리지 않는 이유, 그것은 바로 쿠키(cookie) 때문이다.

          쿠키란 쉽게 말해 사용자가 웹서버에 요청할 때, "나 영숙인데~ 나 예전에 로그인 했었어 !"라고 알려주는 것이다.

 

          쿠키는 어떻게 주고 받는 것인가?

          1. 사용자는 먼저 웹서버에게 자신의 ID와 비밀번호를 보낸다.

          2. 웹서버는 ID와 비밀번호를 확인하고 쿠키를 만들어 사용자에게 전달하며,

              웹서버에는 쿠키를 이용해 session id를 만든다.

          3. 사용자는 브라우저에 받은 쿠키를 저장한다.

          4. 사용자는 이후에 웹서버에 요청할 때, 브라우저에 저장된 쿠키를 포함시켜 내가 누구인지를 알린다.

          5. 웹서버는 받은 쿠키를 통해 session id와 비교하여 "아 너, 로그인 했었던 사용자구나!"라는 것을 인지한다.

              (웹서버는 쿠키를 발급한 후 session id로 서버 내에 사용자 정보를 저장)


4. 사용 도구

      ① Cookie Editor

      ② 브라우저 개발자 도구

 

       둘 중 무엇을 사용해도 상관없다.


5. 문제 풀이

ⓛ 접근

쿠키로 인증 상태를 관리한다는 것은 "admin"의 쿠키를 알아내서 웹서버에게 보낸다면 웹서버는 admin이 요청하는 것이라 착각하고 응답을 줄 것이다. 그렇다면 어떻게 admin의 쿠키 값을 알아내고 웹서버에게 보낼 것인가?

 

우선, 서버를 생성하고 접속부터 해보자

[그림1. 서버 접속 시 첫 페이지]

 

환영한다는 한마디와 함께 메뉴탭이 보인다. 우리는 admin으로 로그인을 해야 Flag를 얻을 수 있기 때문에 로그인페이지에 접속해 본다.

 

[그림2. 로그인 페이지]

 

로그인을 해야하나 우리는 알고 있는 ID와 PW가 없어서 무엇으로 로그인을 해야할지 막막하다.

이럴 때, 찾는것이 바로 힌트 !(실제로 우리가 어떤 웹사이트에서 접속을 해서 해킹을 한다면 회원가입을 해보고 쿠키변조를 시도해보겠지만 이것은 테스트 환경이기 때문에 힌트가 숨겨져있다.)

드림핵 사이트에 있는 문제 파일 받기를 한 후 웹서버가 동작하는 코드(app.py)를 확인한다.

(사실, 코드를 볼 필요 없이 개발자도구에만 들어가도 주석으로 힌트가 있다...)

 

② 코드 분석

[그림3]. app.py 코드

 

파이썬 코드로 이루어진 Flask 웹서버이다.

[그림4. 어플리케이션 실행 코드]

 

사실상 문제를 풀 때, 의미 없는 기본적인 구성 코드이다.

우리가 찾고자 하는 FLAG 값이 ./flag.txt에 저장되어 있음을 알 수 있다.

 

[그림5. 사용자 ID와 PW를 저장하는 코드]

Flask 서버에서 users라는 변수? 사전?에 사용자의 ID와 PW가 저장 되어 있음을 알 수 있다.

ID: guest의 PW는 guest / ID: admin의 PW는 우리가 찾고자 하는 FLAG이다.

 

[그림6. 각 페이지의 동작 코드]

 

'/' 페이지에서 사용자의 쿠키값을 확인하고 쿠키값이 'admin'일 경우 FLAG를 출력하고 아닐 경우 'you are not admin' 문구를 출력한다. 쿠키 값이 없을 경우 index.html 페이지를 보여준다. 이로인해 쿠키가 username으로 저장됨을 알 수 있다.

 

'/login' 페이지 에서는 사용자의 ID와 PW를 받아 users 저장소에 있는 내용과 비교하여 값을 반환한다.

만약에 사용자가 없거나 사용자명+비밀번호가 틀리면 경고창을 출력하고 정상적으로 로그인을 했다면 'username' 즉 ID를 쿠키로 설정하고 사용자에게 응답한다. 그리고 최초 접속 페이지로 리다이렉트 한다.

 

③ 적용

위의 코드에서 알아낸 중요한 정보.

★ 사용자 중에 guest의 비밀번호는 guest이다.

★ 쿠키값은 사용자 ID로 저장된다.

★ admin으로 접속하면 FLAG 값이 페이지에 출력된다.

 

 

[그림7. guest로 접속 했을 때의 응답 페이지]

 

사용자 ID guest로 접속 했을 때, 위와 같은 페이지가 응답된다.

위의 코드 분석을 기반으로 웹서버가 어떻게 동작했을지 추정해보자면,

ID: guest / PW: guest로 접속하면 웹서버 내 'users' 저장소에 해당 값이 있는지 비교해보고 쿠키값을 guest로 만들어서 사용자에게 응답한다. 그리고 첫페이지로 리다이렉트하면서 화면에 위와 같은 문구를 출력한다.

 

[그림8. 개발자도구를 이용한 쿠키값 확인]

 

쿠키를 변조하거나 확인하는데 브라우저에서 사용할 수 있는 여러 도구가 있지만 가장 기본적인 개발자도구를 통해 확인해보았다. 방법은 웹사이트에서 F12 누르기 > Application > 왼쪽의 Cookies 선택 > 아래의 도메인 주소 선택

우리가 코드를 분석한 대로, 쿠키는 username에 ID로 저장되어 있는 것을 확인할 수 있다.

 

그렇다면, 이 쿠키 값을 admin으로 변조하여 웹서버에 보낸다면 웹서버는 과연 admin으로 착각할까?

 

[그림9. 쿠키값 변조]

 

방법은 간단하다. 아까 쿠키값을 확인 했던 개발자 도구에서 Value 값을 admin으로 변경해주면 되는 것.

그리고나서 새로고침을 해주면 브라우저는 웹서버로 쿠키값이 admin인 요청을 보낼 것이다.

 

[그림10. 웹서버의 착각, 그리고 정답]

 

분석하고 추정한대로 쿠키값을 admin으로 변조해서 보냈을 때, 웹서버는 admin이 요청을 보낸것이라고 착각을 했다 !!

그리고 순순히 정답을 알려주는 웹사이트. 스포일러 방지 차원으로 FLAG 값은 지웁니다.


상기 내용 중 오류가 있다면 댓글로 피드백 부탁 드립니다 !!

 

허가 받지 않은 해킹은 정보통신망 이용촉진 및 정보보호 등에 관한 법률, 정보통신 기반 보호법, 형법 등에 의거하여

처벌 받을 수 있습니다.

반응형