ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [DreamHack] session-basic
    2022/Write-Ups 2022. 8. 30. 22:46

    1팀 정유진

    admin 계정으로 로그인에 성공하면 된다고 한다.

    해당 웹페이지에 들어가면

    로그인 창이 있다.

    guest/guest 로 했더니 아니라고 뜬다.

     

    소스코드를 한번 보자!

     

    #!/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
    }


    # this is our session storage
    session_storage = {
    }


    @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"}')


    @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>'


    @app.route('/admin')
    def admin():
        # what is it? Does this page tell you session?
        # It is weird... TODO: the developer should add a routine for checking privilege
        return session_storage


    if __name__ == '__main__':
        import os
        # create admin sessionid and save it to our storage
        # and also you cannot reveal admin's sesseionid by brute forcing!!! haha
        session_storage[os.urandom(32).hex()] = 'admin'
        print(session_storage)
        app.run(host='0.0.0.0', port=8000)
     
     

    주소부분에 /admin을 적어주고 새로고침하면

    저렇게 admin 세션값이 나온다.

    이 값을 가지고

    아까 로그인 실패 창에 들어가서 세션 아이디로 넣어준다.

     

    플래그가 나온다.