본문 바로가기

드림핵

[드림핵 워게임] session-basic

<문제>

위의 문제를 다음과 같은 과정으로 풀어보았다.

 

1. 소스코드 다운로드

드림핵 문제 페이지에서 Description > File > Download 를 클릭하고 압축을 풀면 'app2.py'이라는 파이썬 코드를 확인할 수 있다.

 

 

2. 코드 분석

users = {
    'guest': 'guest',
    'user': 'user1234',
    'admin': FLAG
}

11~15행에 있는 users를 보면 guest, user, admin 3개의 계정이 있는 것을 확인할 수 있다.

 

 

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

23~32행을 살펴보면, cookie에서 sessionid를 키로 하여 session_id값을 불러내었고, session_storage에서 해당 session_id를 키로 하여 username을 가져오고 있다. 그 username이 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>'

위의 코드를 보면 /login페이지에서 로그인을 할 때 랜덤한 문자열로 session_id를 생성하여 쿠키에 저장하는 것을 볼 수 있다. 인덱스 페이지에서는 이렇게 저장된 쿠키를 이용해 사용자의 username을 식별하고 있으므로 admin의 session_id를 알 수 있다면 admin 계정으로 로그인할 수 있다.

 

 

@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

56~60행을 보면 admin이라는 페이지가 있는 것을 볼 수 있다. 해당 페이지로 들어가본다.

 

 

admin 페이지에서 모든 사용자의 session id를 볼 수 있다. 이 중에서 admin계정의 session id을 쿠키에 저장하면 admin 계정으로 로그인될 것이다.

 

 

3. 쿠키를 수정하여 admin계정으로 로그인

EditThisCookie라는 프로그램을 이용해 sessionid를 admin의 sessionid로 수정한다. 이제 다시 인덱스 페이지로 가면 플래그를 얻을 수 있다.

 

'드림핵' 카테고리의 다른 글

[드림핵 워게임] xss-2  (1) 2022.09.21
[드림핵 워게임] xss-1  (1) 2022.09.21
[드림핵 워게임] cookie  (0) 2022.09.16
[드림핵 워게임] web-misconf-1  (0) 2022.09.16
[드림핵 워게임] devtools-sources  (0) 2022.09.16