λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

SWUFORCE/μ›Œκ²Œμž„ 풀이

[Dreamhack] simple-web-request (web)

문제 μ„€λͺ… 


μ›Ή μ„œλ²„μ— μ ‘μ†ν•˜λ‹ˆ μœ„μ™€ 같이 총 μ„Έ κ°€μ§€μ˜ μ‚¬μ΄νŠΈμ— 접속할 수 μžˆκ²Œλ” ν‘œμ‹œκ°€ λœλ‹€. 

문제 μ„€λͺ…에 λ‚˜μ™€ μžˆλ“―μ΄ STEP 1κ³Ό STEP 2을 거쳐야 Flagλ₯Ό νšλ“ν•  수 μžˆλ‹€.

아직 STEP 1을 μˆ˜ν–‰ν•˜μ§€ λͺ»ν–ˆκΈ° λ•Œλ¬Έμ— STEP 2 νŽ˜μ΄μ§€λŠ” 접속쑰차 λ˜μ§€ μ•ŠλŠ”λ‹€.  

 

step 1

 

파이썬 μ½”λ“œλ₯Ό μ—΄μ–΄μ„œ μ‚΄νŽ΄ 보면 μ•„λž˜μ™€ κ°™λ‹€. 

#!/usr/bin/python3
import os
from flask import Flask, request, render_template, redirect, url_for
import sys

app = Flask(__name__)

try: 
    # flag is here!
    FLAG = open("./flag.txt", "r").read()      
except:
    FLAG = "[**FLAG**]"


@app.route("/")
def index():
    return render_template("index.html")


@app.route("/step1", methods=["GET", "POST"])
def step1():

    #### 풀이와 κ΄€κ³„μ—†λŠ” μΉ˜νŒ… λ°©μ§€ μ½”λ“œ
    global step1_num
    step1_num = int.from_bytes(os.urandom(16), sys.byteorder)
    ####

    if request.method == "GET":
        prm1 = request.args.get("param", "")
        prm2 = request.args.get("param2", "")
        step1_text = "param : " + prm1 + "\nparam2 : " + prm2 + "\n"
        if prm1 == "getget" and prm2 == "rerequest":
            return redirect(url_for("step2", prev_step_num = step1_num))
        return render_template("step1.html", text = step1_text)
    else: 
        return render_template("step1.html", text = "Not POST")


@app.route("/step2", methods=["GET", "POST"])
def step2():
    if request.method == "GET":

    #### 풀이와 κ΄€κ³„μ—†λŠ” μΉ˜νŒ… λ°©μ§€ μ½”λ“œ
        if request.args.get("prev_step_num"):
            try:
                prev_step_num = request.args.get("prev_step_num")
                if prev_step_num == str(step1_num):
                    global step2_num
                    step2_num = int.from_bytes(os.urandom(16), sys.byteorder)
                    return render_template("step2.html", prev_step_num = step1_num, hidden_num = step2_num)
            except:
                return render_template("step2.html", text="Not yet")
        return render_template("step2.html", text="Not yet")
    ####

    else: 
        return render_template("step2.html", text="Not POST")

    
@app.route("/flag", methods=["GET", "POST"])
def flag():
    if request.method == "GET":
        return render_template("flag.html", flag_txt="Not yet")
    else:

        #### 풀이와 κ΄€κ³„μ—†λŠ” μΉ˜νŒ… λ°©μ§€ μ½”λ“œ
        prev_step_num = request.form.get("check", "")
        try:
            if prev_step_num == str(step2_num):
        ####

                prm1 = request.form.get("param", "")
                prm2 = request.form.get("param2", "")
                if prm1 == "pooost" and prm2 == "requeeest":
                    return render_template("flag.html", flag_txt=FLAG)
                else:
                    return redirect(url_for("step2", prev_step_num = str(step1_num)))
            return render_template("flag.html", flag_txt="Not yet")
        except:
            return render_template("flag.html", flag_txt="Not yet")
            

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

μ½”λ“œ λ‚΄μš©μ„ 읽닀 λ³΄λ‹ˆ paramκ³Ό param2λ₯Ό μ§μ ‘μ μœΌλ‘œ μ•Œλ €μ£ΌλŠ” 뢀뢄이 μžˆλ‹€. 

 

if prm1 == "getget" and prm2 == "rerequest":

이 λ‚΄μš© κ·ΈλŒ€λ‘œ ν‚€μ›Œλ“œλ₯Ό μž…λ ₯ν•΄ λ³΄λ‹ˆ, 해결이 된 λ“― STEP 2둜 μΆ”μ •λ˜λŠ” 화면이 λ‚˜νƒ€λ‚œλ‹€. 

STEP 2

 

μœ„μ˜ μ½”λ“œλ₯Ό λ‹€μ‹œ μ‚΄νŽ΄λ³΄λ©΄ μ•žμ„  STEP 1의 닡이 μ•„λ‹Œ, 또 λ‹€μ‹œ paramκ³Ό param2λ₯Ό μ–ΈκΈ‰ν•˜λŠ” μ½”λ“œκ°€ λ‚˜μ˜¨λ‹€. 

if prm1 == "pooost" and prm2 == "requeeest":

이 λ‚΄μš© κ·ΈλŒ€λ‘œ ν‚€μ›Œλ“œλ₯Ό μž…λ ₯ν•΄ 보면, 

ν”Œλž˜κ·Έλ₯Ό μ•Œλ € μ€€λ‹€. 이 λ‚΄μš© κ·ΈλŒ€λ‘œ λ“œλ¦Όν•΅ 문제 νŽ˜μ΄μ§€μ— μž…λ ₯ν•˜λ©΄ ν•΄κ²° μ™„λ£Œ

'SWUFORCE > μ›Œκ²Œμž„ 풀이' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[Dreamhack] php7cmp4re (web)  (0) 2024.05.07
[Dreamhack] Carve Party (web)  (0) 2024.05.01
[Dreamhack] Flying Chars  (0) 2024.04.02
[Dreamhack] ex-reg-ex(web)  (0) 2024.04.02
[Dreamhack] file-download-1(web)  (0) 2024.03.26