SWUFORCE/워게임

Dreamhack_cookje(webhacking) - 쿠키&파이썬 파일 읽기

hmyang444 2026. 3. 24. 15:46

<파일에 있었던 파이썬 파일>

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

 

백엔드 코드를 접할 때 어떻게 풀면 더 쉬워지는지 알아보기로 함.

 

gemini한테 도움을 요청해보니 이런 백엔드 코드는  데이터가 어디서 들어오고(Input), 어떻게 처리되어(Process), 어디로 나가는가(Output) 흐름만 잡으면 아주 쉽다고 한다. 

 

 

 

[1] 상단: Flask 앱을 만들고, FLAG 값을 읽어오고, 유저 정보(users)를 저장

app = Flask(__name__)

try:
    FLAG = open('./flag.txt', 'r').read() 
except:
    FLAG = '[**FLAG**]'

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

 

[2] 메인함수

@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 : 앱의 경로 --> 그 경로가 '/' 니까 아무것도 없는 상태, 메인 페이지(홈)를 뜻함

 

[3] (/login): 로그인 화면 - 아이디/비번을 확인하고 쿠키 주기

가장 중요한 부분은 로그인 성공 시메인 화면 접속 시의 상호작용입니다.

@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)
  1. 사용자가 입력한 username을 users 사전에서 찾습니다.
    • users['admin']의 값은 진짜 FLAG
    • users['guest']의 값은 문자열 guest
  2. 입력한 비밀번호(password)와 사전의 값(pw)이 일치하면?
  3. 쿠키를 굽습니다: resp.set_cookie('username', username).

 


[1] 쿠키란?

 

웹 브라우저와 서버는 비연결성(Stateless)이라는 특징이 있다. 따라서 서버가 사용자를 기억하기 위해 브라우저에 저장하는 것이 쿠기라고 할 수 있다.

 

[2] 쿠키를 이용한 웹해킹

쿠키는 사용자(브라우저) 측에 저장되기 때문에, 사용자가 마음대로 열어보고 수정할 수 있다.

 

1. 쿠키 변조(Cookie Manipulation): 서버가 쿠키를 너무 믿을 때 생기는 문제

  • 공격 방식: username=guest를 username=admin으로 슬쩍 바꾼다.
  • 결과: 서버는 별도의 검증 없이 관리자임을 맹신하고 flag를 준다.  

 

2. 세션 하이재킹( Session Hijacking): 다른 사람의 '로그인된 쿠키'를 통째로 훔치는 공격

  • 공격 방식: 해커가 피해자의 브라우저에서 쿠키 값을 복사해 본인의 브라우저에 넣습니다.
  • 결과: 아이디/비밀번호 없이도 타인의 계정으로 로그인된 상태가 됩니다.

 

[3] 방어 방법

보안 옵션 역할 효과
HttpOnly 자바스크립트로 쿠키를 못 읽게 함 XSS 공격으로 쿠키를 훔치는 것을 방지
Secure HTTPS(암호화 통신) 연결에서만 전송 중간에서 쿠키를 낚아채는 것을 방지
Session ID 쿠키에 '이름' 대신 '복잡한 랜덤 문자열' 저장 사용자가 자기 권한을 마음대로 수정하지 못하게 함
  1.  

 

'SWUFORCE > 워게임' 카테고리의 다른 글

Dreamhack_Don't Do(S) that!(forensic) - 패킷 분석  (0) 2026.03.31
Dreamhack_Don't Do(S) That!(forensic)  (0) 2026.03.31
워게임 - FFFFAAAATTT  (0) 2026.03.31
Dreamhack_cookje(webhacking)  (0) 2026.03.24
워게임 - Snowing!  (0) 2026.03.20