완료됨
cookie가 설정안되어 있어도 되는 이유(답 스포주의)
@app.route("/change_password")
def change_password():
session_id = request.cookies.get('sessionid', None)
try:
username = session_storage[session_id]
csrf_token = token_storage[session_id]
except KeyError:
return render_template('index.html', text='please login')
pw = request.args.get("pw", None)
if pw == None:
return render_template('change_password.html', csrf_token=csrf_token)
else:
if csrf_token != request.args.get("csrftoken", ""):
return '<script>alert("wrong csrf token");history.go(-1);</script>'
users[username] = pw
return '<script>alert("Done");history.go(-1);</script>'
flag 페이지에서
<image src="/change_password?pw=admin&csrftoken=7505B9C72AB4AA94B1A4ED7B207B67FB">
위 처럼 입력하면 풀리는것은 알고 있습니다.
그런데 저렇게 입력하면 change_password함수 첫 줄에 sessionid가 설정 안되어 있고 따라서 session_id가 None이 됩니다.
try 구문에서 username은 session_storage[None]이 되는데 이때 에러가 발생하여 index.html로 redirect되어야하지 않나요?
#web
작성자 정보
답변
1
안녕하세요.
/flag 페이지에서 POST 요청으로 임의의 값을 제출하시면
check_csrf > read_url 순서로 함수가 호출되는데요.
read_url 함수 42-46 라인을 살펴보시면 /login 경로로 이동한 후
admin 계정정보(admin, users["admin"])로 자동으로 로그인이 됩니다.
이 때, /login 경로로 POST 요청이 보내지고
session_storage[session_id] = username 코드가 실행되어져 session_id 값이 설정됩니다.
/flag 경로에서 param 파라미터에 보낸 값은 상기 과정이 모두 수행된 후에
마지막 47라인에서 driver.get(url); 코드에 의해 실행되므로, try {...} 블럭에서 예외가 발생하지 않게 됩니다.
