문제정보
쿠키와 세션으로 인증 상태를 관리하는 간단한 로그인 서비스입니다.
admin 계정으로 로그인에 성공하면 플래그를 획득할 수 있습니다.
Keypoint
Brute Force
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',
'user': 'user1234',
'admin': FLAG
}
session_storage = {
}
@app.route('/')
def index():
session_id = request.cookies.get('sessionid', None)
try:
username = session_storage[session_id]
except KeyError:
return render_template('index.html')
return render_template('index.html', text=f'Hello {username}, {"flag is " + FLAG if username == "admin" else "you are not admin"}')
@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')) )
session_id = os.urandom(4).hex()
session_storage[session_id] = username
resp.set_cookie('sessionid', session_id)
return resp
return '<script>alert("wrong password");history.go(-1);</script>'
if __name__ == '__main__':
import os
session_storage[os.urandom(1).hex()] = 'admin'
print(session_storage)
app.run(host='0.0.0.0', port=8000)
메인화면
위 문제는 앞선 session-basic과 같이 session을 수정하여 'admin' 계정으로 로그인 하는 문제이다.
코드에서 가장 유심히 봐야 하는 부분이다.
현재 os.urandom(1).hex 함수로 세션을 생성하기 때문에 'admin'의 세션값은 2글자이다.
버프슈트의 브루트포스 기능을 이용하여 빨간박스 안에 있는 세션값을 찾을 예정이다.
a부터 z 그리고 숫자까지 경우의수는 총 1296개이다.
몇번째만에 나올지는 모르지만, admin 계정으로 로그인을 성공했을경우 Response의 문자열이 다른것들과 다를거다.
214번의 대입만에 Response의 길이가 다른것을 발견하였고, 확인해보니 FLAG가 나왔다.
admin의 세션값은 '7f' 였다. (물론 이 세션값은 랜덤값이기 때문에 사람마다 다릅니다.)
FLAG
DH{73b3a0ebf47fd6f68ce623853c1d4f138ad91712}
'DreamHack > web' 카테고리의 다른 글
[wargame] Carve Party (0) | 2023.07.23 |
---|---|
[wargame] mongoboard (0) | 2023.07.18 |
[wargame] devtools-sources (0) | 2023.07.17 |
[wargame] csrf-2 (0) | 2023.07.17 |
[wargame] session-basic (0) | 2023.07.17 |