본문 바로가기
Dreamhack WarGame

[Dreamhack] Cookie 문제 풀이

by whiteTommy 2024. 1. 4.

 

 

우선, 쿠키로 인증 상태를 관리하는 로그인 서비스 문제이므로 웹으로 접속하자.

 

여기서, Login 버튼을 누르면, 로그인 페이지가 나온다

 

 

이제, 문제에서 주어진 파일을 통해 압축을 풀어서 python 파일을 열어보자

#!/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로 쓰인 언어이고, flag.txt 파일 내용을 FLAG 변수에 저장하고, 파일이 존재하지 않으면 FLAG 변수에는 [**FLAG**] 값이 저장된다. 또한, users라는 객체에 2가지의  key와 value가 존재하는데, guest에 해당하는 값은 guest이며, admin에 해당하는 값은 FLAG 즉, flag.txt 파일 내용이다.

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

 

위의 코드를 보면, 로그인 페이지에는 사용자가 손님 계정과, 관리자 계정이 있고, 관리자 계정으로 로그인을 해야 우리가 궁극적으로 원하는 값인 FLAG를 얻을 수 있음을 예측할 수 있다.

 

다음으로, index() 함수를 보자.

@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')

 

username 값으로 cookie를 얻어서 username에 저장한다.

 

이 값이 존재하고 이 값이 guest면, Hello guest, you are not admin 이 출력된다

 

하지만, 우리는 admin으로 접속해야  Hello admin, flag is {FLAG} 가 출력되므로, 다시 로그인을 해보려고 했는데, password가 우리가 구하고자 하는 FLAG 값 자체이므로 로그인을 할 수 없다.

 

다음 코드를 보자.

@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)

 

GET 메소드로 접근하면, login 페이지가 렌더링 되고, POST 메서드로 접근하면, username과 password의 값이 각각 username과 password에 저장되고, 앞서 언급한 users 객체에 해당하는 값 pw가 password과 일치하면 username 값이 cookie로 username에 설정된다.

 

앞서, guest로 설정된 cookie에서 admin으로 바꿔주면 관리자 계정으로 로그인할 수 있다.

 

개발자 모드에서 guest에 해당하는 cookie를 확인해보자.

 

여기서, username에 해당하는 값을 admin으로 수정하고 새로 고침 하면

 

FLAG 값을 찾을 수 있다.

'Dreamhack WarGame' 카테고리의 다른 글

[Dreamhack] csrf-1 문제 풀이  (0) 2024.03.15
[Dreamhack] xss-1 문제 풀이  (0) 2024.01.06
[Dreamhack] blue-whale 문제 풀이  (1) 2023.11.30
[Dreamhack] phpreg 문제 풀이  (1) 2023.11.28
[Dreamhack] ex-reg-ex 문제 풀이  (1) 2023.11.28