
μλ
νμλκΉ μ½λ© νμΈμ νμ
λλ€
μ΄λ²μλ λλ¦Ό λ³μ π±μ κ΄ν΄ νμ΄λ³΄κ² μ΅λλ€.
https://dreamhack.io/wargame/challenges/2814
μ ν¬ λλ¦Ό λ³μμ νμ μ 보λ₯Ό μμ νκ² λ³΄νΈνκ³ μμ΅λλ€. π₯
...

import hashlib
import os
from flask import Flask, render_template, request, redirect, url_for, session, abort
app = Flask(__name__)
app.secret_key = os.urandom(24).hex()
health_records = {
1: {
"name": "κΉκΉλ°",
"date": "2024-03-10",
"height": "175cm",
"weight": "70kg",
"blood_pressure": "120/80",
"diagnosis": "νΉμ΄μ¬ν μμ (κ²μ§μλ£)",
"summary": "DH{This_is_fake_flag}", #βνλκ·Έ μμΉ
"owner": "admin"
},
125: {
"name": "κΉλλ¦Ό",
"date": "2024-03-25",
"height": "180cm",
"weight": "75kg",
"blood_pressure": "115/75",
"diagnosis": "λΉνλ―Ό D λΆμ‘± κΆκ³ ",
"summary": "μ λ°μ μΌλ‘ μνΈνλ©° κΎΈμ€ν μ΄λμ κΆμ₯ν©λλ€.",
"owner": "guest"
}
}
def get_hash(uid):
return hashlib.md5(str(uid).encode()).hexdigest()
@app.route('/')
def index():
if 'user' in session:
return redirect(url_for('dashboard'))
return render_template('index.html')
@app.route('/auth/login', methods=['POST'])
def login():
if request.form.get('username') == 'guest' and request.form.get('password') == 'guest':
session['user'] = 'guest'
return redirect(url_for('dashboard'))
return "Login Failed", 401
@app.route('/auth/logout')
def logout():
session.pop('user', None)
return redirect(url_for('index'))
@app.route('/dashboard')
def dashboard():
if 'user' not in session:
return redirect(url_for('index'))
user_data = health_records[125]
return render_template('dashboard.html', user_hash=get_hash(125), name=user_data['name'])
@app.route('/report/view/<user_hash>')
def view_report(user_hash):
if 'user' not in session:
return redirect(url_for('index'))
for uid, data in health_records.items():
if get_hash(uid) == user_hash:
if data['owner'] != session['user']:
return "<h1>Access Denied</h1>", 403
return render_template('report.html', data=data, user_hash=user_hash)
return "Not Found", 404
@app.route('/report/download/<user_hash>')
def download_report(user_hash):
if 'user' not in session:
return redirect(url_for('index'))
for uid, data in health_records.items():
if get_hash(uid) == user_hash:
return render_template('print.html', data=data)
return "Not Found", 404
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000, debug=False)
μΌλ¨ guest/guestλ₯Ό ν΅ν΄ guestλ‘ λ‘κ·ΈμΈ ν΄λ΄ μλ€

μ, μ½λλ₯Ό μ΄ν΄λ΄ μλ€
μ½λλ₯Ό 보μλ©΄ λ€μκ³Ό κ°μ΄ μμ¬μ€λ¬μ΄ λΆλΆμ΄ μ‘΄μ¬ν©λλ€
def get_hash(uid):
return hashlib.md5(str(uid).encode()).hexdigest()
...
@app.route('/report/view/<user_hash>')
def view_report(user_hash):
if 'user' not in session:
return redirect(url_for('index'))
for uid, data in health_records.items():
if get_hash(uid) == user_hash:
if data['owner'] != session['user']:
return "<h1>Access Denied</h1>", 403
return render_template('report.html', data=data, user_hash=user_hash)
return "Not Found", 404
μ΄λ κ² λ€μκ³Ό κ°μ΄ uidλ₯Ό λ¬Έμμ΄λ‘ λ³νν λ€ MD5 μκ³ λ¦¬μ¦μΌλ‘ ν΄μ±νκ³ , κ·Έ κ²°κ³Όλ₯Ό 16μ§μ λ¬Έμμ΄λ‘ λ°ννλ ꡬ문μ urlμ λ£μ΄ IDORμ΄ κ°λ₯ν¨μ μ μΆν μ μμ΅λλ€.
report/view/3def184ad8f4755ff269862ea77393dd
guestλ‘ λ‘κ·ΈμΈνμλ©΄ urlμ΄ λ€μκ³Ό κ°μ΄ λμ€λ κ²μ μ μ μμΌλ©° μ΄λ 125μ(health_recordμ guestλ²νΈ) get_hash() κ°μμ μ μ μμ΅λλ€
λ°λΌμ μ ν¬λ ownerκ° adminμ λ²νΈκ° λλ 1μ get_hash()μ λ£μ΄ IDORλ₯Ό μλν μ μμ΅λλ€.
νμ§λ§ μ΄κ±Έ κ³§μ΄κ³§λλ‘ /report/view/<user_hash> μ λ£κ² λλ©΄ μ½λμ²λΌ 'Access Denied'κ° λμ€κ² λ©λλ€
κ²°κ³Όνκ° λλ /report/download/<user_hash> λ μ’ λ€λ₯Έ κ²°κ³Όκ° λμ΅λλ€
@app.route('/report/download/<user_hash>')
def download_report(user_hash):
if 'user' not in session:
return redirect(url_for('index'))
for uid, data in health_records.items():
if get_hash(uid) == user_hash:
return render_template('print.html', data=data)
return "Not Found", 404
/report/view/<user_hash>μλ λ€λ₯΄κ² λ‘κ·ΈμΈ νμΈ ν, μ°Ύμ λ°μ΄ν°μ μ£ΌμΈκ³Ό νμ¬ λ‘κ·ΈμΈν μ¬μ©μκ° μΌμΉνλμ§ λΉκ΅νμ§ μκΈ°μ
(data['owner'] != session['user'])
/report/view/c4ca4238a0b923820dcc509a6f75849b
μ ν΅ν΄ μ κ·Όνλ©΄ νλκ·Έλ₯Ό νλν μ μκ² λ©λλ€.
FLAG :

νκ° :
