ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • session-basic
    해킹/웹해킹 실전 2023. 11. 21. 00:07

    https://dreamhack.io/wargame/challenges/409

     

    session-basic

    Description 쿠키와 세션으로 인증 상태를 관리하는 간단한 로그인 서비스입니다. admin 계정으로 로그인에 성공하면 플래그를 획득할 수 있습니다. 플래그 형식은 DH{...} 입니다. Reference Background: Cook

    dreamhack.io

    @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를 얻을 수 있다.

     

    '해킹 > 웹해킹 실전' 카테고리의 다른 글

    csrf-1  (0) 2023.11.21
    xss-2  (0) 2023.11.21
    xss-1  (0) 2023.11.21
    cookie  (1) 2023.11.20

    댓글

Designed by Tistory.