-
session-basic해킹/웹해킹 실전 2023. 11. 21. 00:07
https://dreamhack.io/wargame/challenges/409
@app.route('/') def index(): session_id = request.cookies.get('sessionid', None) try: # get username from session_storage 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"}')
홈페이지에서 sessionid의 쿠키를 가져와 session_storage의 dictionary에서 value를 가져와 admin이면 flag를 보여준다. 따라서 admin에 해당하는 session_id를 얻어야한다.
@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: # you cannot know admin's pw 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(32).hex() session_storage[session_id] = username resp.set_cookie('sessionid', session_id) return resp return '<script>alert("wrong password");history.go(-1);</script>'
login은 password를 알아야하므로 admin으로 로그인을 할 수 없어 사용할 수 없다.
@app.route('/admin') def admin(): # developer's note: review below commented code and uncomment it (TODO) #session_id = request.cookies.get('sessionid', None) #username = session_storage[session_id] #if username != 'admin': # return render_template('index.html') return session_storage
근데 admin page로 들어가면 session_storage에 있는 값을 바로 보여준다. 따라서 session_storage의 dictionary중 value가 admin인 session id를 얻을 수 있다.
홈페이지로 돌아와서 cookie를 admin의 session_id로 변경해주고 새로고침하면 FLAG를 얻을 수 있다.