본문 바로가기
정보보안/Web Hacking

드림핵 문제풀이 - Session Basic // Cookie, Session, 인증, Web hacking

by 우동이 2022. 3. 21.
300x250

문제 분류


난이도 : 하

 


Session-basic 문제는 쿠키와 세션을 통한 인증상태에 관한 문제입니다.

해당 문제에서 제공하는 URL은

/index

/login

/admin

세가지 입니다.

 

#문제파일 app.py
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
}

session_storage = {
}


@app.route('/')
def index():
    session_id = request.cookies.get('sessionid', None)
    try:
        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:
            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():
    return session_storage


if __name__ == '__main__':
    import os
    session_storage[os.urandom(32).hex()] = 'admin'
    print(session_storage)
    app.run(host='0.0.0.0', port=8000)

문제풀이에 들어가기 전에 먼저 제공받은 문제파일을 살펴보겠습니다.

역시 flask로 구동중인 웹서버입니다.

 

여기서 확인해볼만한 코드는 아래와 같습니다.

app.py

현재 세개의 계정이 등록되어 있으며(guest,user,admin)

admin(관리자) 계정의 암호가 FLAG임을 알 수 있습니다.

 

/login
/admin

쭉 코드를 살펴본 결과 

사용자의 세션에 대한 인증이 따로 존재하지 않음을 알 수 있습니다.(app.secret_key 같은?? 이게 세션인증인지는 잘 모르겠지만)

아무튼 세션 탈취를 시작해봅시다.

 

 

먼저 암호를 모르는 admin이 아닌

일반 사용자(guest,user) 계정으로 로그인해봅니다.

 

Guest 계정으로 로그인 시 위와 같은 경고문구가 발생합니다.

역시 admin 계정 권한이 필요한것을 알 수 있습니다.

 

 

[개발자 도구 - Application - Cookies]

에서 쿠키를 살펴보면 sessionid 이름으로 쿠키가 존재하는걸 알 수 있으며

쿠키값이 사용자에게 노출되고 있습니다.

 

그러므로 현재 사용자의 쿠키 값(value)에 admin의 값을 넣어주면

admin 세션으로 변경될듯 합니다.

 

/admin

또한 /admin에서는 자신이 로그인한 계정의 세션값이 [딕셔너리] 형으로 출력되고 있습니다.

이 중 admin의 세션값을 찾습니다.

노란색 칠이 되어있는 부분이 admin의 세션값입니다.

이 세션값을 그대로 복사해서 

현재 생성되어 있는 cookie에 값을 그대로 넣어줍니다.

 

그러면 admin세션으로 전환됨과 동시에 flag가 출력됩니다.

해당 문제는 예전 dreamhack의 cookie문제에서 풀었던 cookie값의 변조와

session에 대한 약간의 이해도만 있으면 쉽게 풀수 있는듯 합니다.

 

 

 

 

 

300x250

댓글