<파일에 있었던 파이썬 파일>
#!/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)
- 사용자가 입력한 username을 users 사전에서 찾습니다.
- users['admin']의 값은 진짜 FLAG
- users['guest']의 값은 문자열 guest
- 입력한 비밀번호(password)와 사전의 값(pw)이 일치하면?
- 쿠키를 굽습니다: 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 | 쿠키에 '이름' 대신 '복잡한 랜덤 문자열' 저장 | 사용자가 자기 권한을 마음대로 수정하지 못하게 함 |
'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 |