쿠키로 인증 상태를 관리하는 간단한 로그인 서비스입니다.
admin 계정으로 로그인에 성공하면 플래그를 획득할 수 있습니다.
플래그 형식은 DH{…} 입니다.
출처: dreamhack
문제 사이트(Home
)에 접속하면 먼저 위와 같은 사이트를 볼 수 있습니다.
About
은 눌러도 페이지가 이동하거나 무언가에 영향을 끼치지 않고 로그인을 누르면 로그인 페이지로 이동할 수 있습니다.
로그인 페이지에 접속하면 위 사진처럼 username
과 password
를 입력받아 로그인하는 것을 확인할 수 있습니다.
#!/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
을 넣으면 됩니다.)
DH{7952074b69ee388ab45432737f9b0c56}