[Dreamhack] cookie 풀이

Dohyun Park·2023년 10월 10일
0

Wargame

목록 보기
2/6
post-custom-banner

🔍️문제 설명

쿠키로 인증 상태를 관리하는 간단한 로그인 서비스입니다.
admin 계정으로 로그인에 성공하면 플래그를 획득할 수 있습니다.

플래그 형식은 DH{…} 입니다.

출처: dreamhack

📗문제 분석

문제 사이트(Home)에 접속하면 먼저 위와 같은 사이트를 볼 수 있습니다.

About은 눌러도 페이지가 이동하거나 무언가에 영향을 끼치지 않고 로그인을 누르면 로그인 페이지로 이동할 수 있습니다.

로그인 페이지에 접속하면 위 사진처럼 usernamepassword를 입력받아 로그인하는 것을 확인할 수 있습니다.

🖥️app.py

#!/usr/bin/python3
from flask import Flask, request, render_template, make_response, redirect, url_for

app = Flask(__name__)

try:
    FLAG = open('./flag.txt', 'r').read()
except:
    FLAG = '[**FLAG**]'

users = {
    'guest': 'guest',
    'admin': FLAG
}

@app.route('/')
def index():
    username = request.cookies.get('username', None)
    if username:
        return render_template('index.html', text=f'Hello {username}, {"flag is " + FLAG if username == "admin" else "you are not admin"}')
    return render_template('index.html')

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'GET':
        return render_template('login.html')
    elif request.method == 'POST':
        username = request.form.get('username')
        password = request.form.get('password')
        try:
            pw = users[username]
        except:
            return '<script>alert("not found user");history.go(-1);</script>'
        if pw == password:
            resp = make_response(redirect(url_for('index')) )
            resp.set_cookie('username', username)
            return resp 
        return '<script>alert("wrong password");history.go(-1);</script>'

app.run(host='0.0.0.0', port=8000)

본 문제에서는 소스코드를 제공하고 있습니다.
주어진 소스코드를 분석하면 flask로 구성된 웹페이지임을 알 수 있습니다.

소스코드분석
루트 페이지(/)에 접속하면 username이라는 쿠키의 값을 가져옵니다.

쿠키값(username)이 있는 경우 Hello, username이 출력되며 username이 admin인 경우 FLAG가 출력됩니다.

쿠키값(username)이 없는 경우 별다른 메시지를 띄우지 않습니다.
/login 페이지에 GET Method를 통해 접속하면 login.html을 사용자에게 띄우고, POST Method를 통해 접속한 경우 username/password를 받아와 로그인하는 절차를 거칩니다.
프로그램이 실행될 경우 flag.txt 파일을 읽음으로써 FLAG라는 변수에 플래그 값이 저장됩니다.

users 라는 배열 변수에 guest라는 아이디는 guest라는 비밀번호를, admin 계정은 플래그값을 패스워드로 가지고 있음을 확인할 수 있습니다.

✏️문제 풀이

로그인 페이지 또한 HTML 코드를 살펴보면 위와 같은 주석을 확인할 수 있습니다.

여기서 username과 password에 guest를 입력해주면 위처럼 guest 계정으로 로그인할 수 있습니다.

이때 개발자모드를 통해 username이라는 쿠키에 guest라는 값이 저장되어있음을 확인할 수 있습니다.

아까 인덱스 페이지(/)에 접속할 때 쿠키값을 판단하여 플래그값을 출력하므로, 문제에서 플래그를 얻기 위해서는 username 쿠키값을 admin으로 바꿔야합니다.

admin으로 쿠키값을 바꾸기 위해서는 admin 계정의 비밀번호인 FLAG값을 알아야만 바꿀 수 있을까요?

쿠키는 공개된 정보로써 변경할 수 있습니다. 위 사진을 통해 확인해보면 현재는 guest 계정으로 로그인하였기에 username이라는 쿠키에 guest라는 값이 저장되어있음을 확인할 수 있습니다.

🍪쿠키값 변경 방법

브라우저별 확장 프로그램을 통해 쿠키값을 쉽게 변경할 수 있습니다.
(개발자 모드를 통해서도 변경가능합니다.)

아까 guest값을 가지고 있던 쿠키값을 admin으로 변경한 후 저장합니다.

(쿠키가 사라진 경우 username이라는 쿠키를 만들고 Value에 admin을 넣으면 됩니다.)

🚩Flag

DH{7952074b69ee388ab45432737f9b0c56}

profile
공부한 내용을 기록하고 생각을 정리합니다.
post-custom-banner

0개의 댓글