[WEB] cookie 문제풀이

쿠키(영어: cookie)란 하이퍼 텍스트의 기록서(HTTP)의 일종으로서 인터넷 사용자가 어떠한 웹사이트를 방문할 경우 그 사이트가 사용하고 있는 서버를 통해 인터넷 사용자의 컴퓨터에 설치되는 작은 기록 정보 파일을 일컫는다.[1] HTTP 쿠키, 웹 쿠키, 브라우저 쿠키라고도 한다.

 

HTTP 쿠키 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 쿠키(영어: cookie)란 하이퍼 텍스트의 기록서(HTTP)의 일종으로서 인터넷 사용자가 어떠한 웹사이트를 방문할 경우 그 사이트가 사용하고 있는 서버를 통해 인터

ko.wikipedia.org

 

문제를 확인해보자.

 

 

admin 계정으로 로그인에 성공하면 플래그를 준다고 한다. 일단 페이지에 접속해보자.

 

 

로그인 페이지를 확인해보자

 

 

역시 admin 계정은 패스워드가 admin일때 쓸모가 있지.

 

 

어딜감히 택도없지. 갓 티오리님들께서 이따위 문제를 내실리가 없지. 

반성하면서 소스코드나 확인해보자.

#!/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',
    'admin': FLAG
}

@app.route('/')
def index():
    username = request.cookies.get('username', None)
    if username:
        return render_template('index.html', text=f'Hello {username}, {"flag is " + FLAG if username == "admin" else "you are not admin"}')
    return render_template('index.html')

@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')) )
            resp.set_cookie('username', username)
            return resp 
        return '<script>alert("wrong password");history.go(-1);</script>'

app.run(host='0.0.0.0', port=8000)

 

11번째 줄에서 두개의 계정을 확인할 수 있다.

[guest/guest], [admin/{flag}]

 

login() 함수를 보게 되면 POST로 로그인 요청을 시도할 시 username과 password를 저장한다.

 

계정이 존재하지 않으면 "not found user" 메세지를 출력하며 이전 페이지로 되돌아간다.

계정이 존재하면 resp 변수에 요청을 응답할 response 페이지를 index 페이지로 만들고,

username으로 쿠키를 생성한다.

 

index() 함수를 보게 되면 username이라는 쿠키의 값을 받아와서 username 변수에 저장한다.

 

username 변수에 저장된 값이 존재한다면, 서버는 사용자에게 hellow 라고 인사할 것이고

username의 값이 admin이 아니라면 "your not admin"이라는 문구를 출력한다.

username의 값이 admin이라면 /flag.txt에 있는 flag 값을 출력해줄 것이다.

 

한 번 guest로 로그인을 해보자.

 

 

역시 admin 계정이 아니기 때문에 당신은 admin이 아니라며 차별한다. 그럼 Cookie 값을 확인해보자.

※ 쿠키 확인 및 변조는 EditThisCookie를 사용했으며, 개발자 도구나 프록시 도구를 사용해도 상관없다.

 

 

쿠키 값을 확인해보니 역시 username이라는 쿠키 값으로 로그인을 시도했던 계정인 guest가 입력되어 있다.

username 쿠키 값이 admin이면 flag를 출력하는 원리이기 때문에 우리는 쿠키 값을 변조해주자.

 

 

쿠키 값을 admin으로 변조했으면 index 페이지로 가서 서버에게 환대받을 수 있도록 하자.

 

플래그가 출력됐다. 역시 1번 문제는 쉬웠지만

소스코드를 분석하는 건 어려웠다. 내 스타일은 아니다.

 

문제풀이 끗.

복사했습니다!