Hamutaro
본문 바로가기
Information security

[Dream Hack] 2. Cookie

by Hackster 2023. 5. 13.

 

 

 

[Dream Hack] 2. Cookie 문제 풀이

 

 

 

 

문제

- 해석 : 쿠키로 인증 상태를 관리하는 간단한 로그인 서비스에 대해서 admin 계정으로 로그인에 성공하여 나오는 플래그를 확인

 

 

 

문제 해설

1. 문제 파일을 다운로드하여 분석해본다.

#!/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)

 

- guest, admin이라는 ID가 있음을 확인

- /login 페이지에서 POST 형식으로 username, password를 받아서 try, except 구문으로 해당 계정이 있는지 없는지를 체크

- username의 db에 있는 pw값이 내가 입력한 password와 같으면 해당 'username'에 해당하는 set_cookie값을 resp로 return한다.

- 우리는 admin의 pw는 모르지만 이에 해당하는 set_cookie 값을 사용하여 flag를 찾을 수 있다.

 

 

2. guest로 로그인해보기 (ID:guest / PW:guest)

 

 

 

3. [개발자도구] -> [Application] -> [Cookie]

- Value의 guest값을 admin으로 변경하고 페이지 새로고침

- Flag를 도출할 수 있다. 

댓글