Dreamhack - ๐ŸŒฑ simple-web-request

์œคยท2025๋…„ 7์›” 19์ผ

Dreamhack-Writeups

๋ชฉ๋ก ๋ณด๊ธฐ
23/52

๐ŸŒฑ simple-web-request

๋ฌธ์ œ ๋งํฌ

https://dreamhack.io/wargame/challenges/830

๋ฌธ์ œ ์„ค๋ช…

STEP 1~2๋ฅผ ๊ฑฐ์ณ FLAG ํŽ˜์ด์ง€์— ๋„๋‹ฌํ•˜๋ฉด ํ”Œ๋ž˜๊ทธ๊ฐ€ ์ถœ๋ ฅ๋˜๋Š” ๋ฌธ์ œ์ด๋‹ค.
ํ”Œ๋ž˜๊ทธ๋Š” flag.txt ํŒŒ์ผ๊ณผ FLAG ๋ณ€์ˆ˜์— ์žˆ๋‹ค.
ํ”Œ๋ž˜๊ทธ ํ˜•์‹์€ DH{...} ์ด๋‹ค.

ํ’€์ด๊ณผ์ •

  1. step1์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ œ์‹œ๋œ app.py๋ฅผ ํ™•์ธํ•ด ๋ณด์•˜๋‹ค.

         app.route("/step1", methods=["GET", "POST"])
      def step1():
      
          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")

    prm1 == "getget" and prm2 == "rerequest": ์ผ ๋•Œ step2๋ฅผ returnํ•˜๋Š”๊ฑธ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

  2. ์•Œ์•„๋‚ธ prm1๊ณผ prm2๋ฅผ ์ž…๋ ฅํ•˜์—ฌ step2๋กœ ์ด๋™ํ•œ๋‹ค.

  3. step2๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ฝ”๋“œ๋ฅผ ๋‹ค์‹œํ•œ๋ฒˆ ํ™•์ธํ•ด ๋ณธ๋‹ค.

         @app.route("/flag", methods=["GET", "POST"])
      def flag():
          if request.method == "GET":
              return render_template("flag.html", flag_txt="Not yet")
          else:
                      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")

    ์ด๋•Œ if prm1 == "pooost" and prm2 == "requeeest": ์ผ ๋•Œ๋งŒ flag.html๋ฅผ returnํ•˜๋Š”๊ฑธ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

  4. ์•Œ์•„๋‚ธ prm1๊ณผ prm2๋ฅผ ์ž…๋ ฅํ•œ๋‹ค.

  5. ์„ฑ๊ณต์ ์œผ๋กœ ํ”Œ๋ž˜๊ทธ๋ฅผ ํš๋“ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.


๋ฐฐ์šด์ 

  • ๊ฐ„๋‹จํ•˜๊ฒŒ flask ์ฝ”๋“œ๋ฅผ ์ฝ๋Š” ๋ฒ•์„ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์—ˆ๋‹ค.
  • ์ฃผ์–ด์ง„ ์กฐ๊ฑด์„ ๋ณด๊ณ  ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋Šฅ๋ ฅ์„ ํ‚ค์šธ ์ˆ˜ ์žˆ์—ˆ๋‹ค.
profile
CTF ํ’€์ด ๋ฐ ์‹ค์Šต ์ค‘์‹ฌ ํ•™์Šต์„ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€