[๐Ÿฅ‰ Bronze 4] ์šฐํšŒํ•  403์€ ์• ์ดˆ์— ์—†์—ˆ๋‹ค โ€” DreamHack 403-forbbiden ํ’€์ด

2026-07-21ยท1๋ถ„ ์ฝ๊ธฐยท

[๐Ÿฅ‰ Bronze 4] ์šฐํšŒํ•  403์€ ์• ์ดˆ์— ์—†์—ˆ๋‹ค โ€” DreamHack 403-forbbiden ํ’€์ด

๊ฐ€์งœ ๋ธŒ๋ผ์šฐ์ € ์ฐฝ ์•ˆ์— "403 Forbidden"์ด ๋–  ์žˆ๋Š” ํŽ˜์ด์ง€. ์ œ๋ชฉ๋ถ€ํ„ฐ ๋Œ€๋†“๊ณ  "403 ์šฐํšŒ"๋ฅผ ์•”์‹œํ•˜๋‹ˆ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ X-Forwarded-For, ๊ฒฝ๋กœ ํŠธ๋ฆญ ๊ฐ™์€ ๊ณ ์ „์ ์ธ ํ—ค๋” ์šฐํšŒ ๊ธฐ๋ฒ•๋ถ€ํ„ฐ ์‹œ๋„ํ•˜๊ฒŒ ๋œ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๊ทธ ํ™”๋ฉด ์† "/secret"์ด๋ผ๋Š” ๋ณดํ˜ธ๋œ ๊ฒฝ๋กœ๋Š” ์• ์ดˆ์— ์„œ๋ฒ„์— ์กด์žฌํ•˜์ง€๋„ ์•Š๋Š” ๋ˆˆ์†์ž„์ด์—ˆ๋‹ค. view-source๋กœ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์—ด์–ด๋ณด๋ฉด ์ง„์งœ ์ทจ์•ฝ์ ์€ ์ „ํ˜€ ๋‹ค๋ฅธ ๊ณณ์— ์žˆ์—ˆ๋‹ค โ€” ํด๋ผ์ด์–ธํŠธ๊ฐ€ "์ •๋‹ต ์กฐ๊ฑด"์„ ์Šค์Šค๋กœ ํŒ๋‹จํ•ด์„œ ๋ณด๋‚ด๋Š” POST ์š”์ฒญ์„, ์„œ๋ฒ„๊ฐ€ ๊ทธ ์–ด๋–ค ๋งฅ๋ฝ๋„ ๊ฒ€์ฆํ•˜์ง€ ์•Š๊ณ  ๊ทธ๋Œ€๋กœ ๋ฐ›์•„์ค€๋‹ค๋Š” ์‚ฌ์‹ค.

๋ฌธ์ œ: DreamHack โ€” 403-forbbiden ๋ถ„๋ฅ˜: Web ๋‚œ์ด๋„: ๐Ÿฅ‰ Bronze 4 FLAG: DH{afjqofuida34@1!21%!1204m1n13aax091!kJ@$}

๋ฌธ์ œ ์ด๋ฆ„๋ถ€ํ„ฐ "403 forbidden error"๋‹ค. ์ด ์ •๋„๋กœ ๋…ธ๊ณจ์ ์ธ ์ œ๋ชฉ์ด๋ฉด ๋ณดํ†ต IP ์Šคํ‘ธํ•‘ ํ—ค๋”๋‚˜ ๊ฒฝ๋กœ ์ •๊ทœํ™” ํŠธ๋ฆญ์œผ๋กœ ์ ‘๊ทผ ์ œ์–ด๋ฅผ ์šฐํšŒํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ๊ธฐ๋Œ€ํ•˜๊ฒŒ ๋œ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ด๋ฒˆ์—” ๊ทธ ๊ธฐ๋Œ€ ์ž์ฒด๊ฐ€ ํ•จ์ •์ด์—ˆ๋‹ค โ€” ํ™”๋ฉด์— ๋ณด์ด๋Š” "๋ณดํ˜ธ๋œ ํŽ˜์ด์ง€"๋Š” ์• ์ดˆ์— ์„œ๋ฒ„์— ์กด์žฌํ•˜์ง€๋„ ์•Š๋Š” ์†Œํ’ˆ์ด์—ˆ๊ณ , ์ง„์งœ ์ทจ์•ฝ์ ์€ ์ „ํ˜€ ๋‹ค๋ฅธ ์ž๋ฆฌ์— ์กฐ์šฉํžˆ ๋†“์—ฌ ์žˆ์—ˆ๋‹ค.


๋ฌธ์ œ ๊ฐœ์š”

VM์„ ๋„์šฐ๋ฉด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ๊ทธ๋ฆฐ ๊ฐ€์งœ ๋ธŒ๋ผ์šฐ์ € ์ฐฝ ํ•˜๋‚˜๊ฐ€ ๋œฌ๋‹ค. ์ฃผ์†Œ์ฐฝ์ฒ˜๋Ÿผ ์ƒ๊ธด ์š”์†Œ์— securevault.dreamhack.games/secret์ด๋ผ๋Š” ๊ทธ๋Ÿด๋“ฏํ•œ URL์ด ์ ํ˜€ ์žˆ๊ณ , ๊ทธ ์•ˆ์— ํผ์ง€๋ง‰ํ•˜๊ฒŒ "403 Forbidden"์ด ํ‘œ์‹œ๋œ๋‹ค.

host3.dreamhack.games ํฌํŠธ๋กœ ์ ‘์†ํ•œ ์ฒซ ํ™”๋ฉด โ€” ์ง„์งœ ๋ธŒ๋ผ์šฐ์ € ์ฃผ์†Œ์ฐฝ์€ host3.dreamhack.games:PORT๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š”๋ฐ, ํŽ˜์ด์ง€ ์•ˆ์— ๊ทธ๋ ค์ง„ ๊ฐ€์งœ ์ฃผ์†Œ์ฐฝ์—๋Š” securevault.dreamhack.games/secret ์ด๋ผ๋Š” ๊ทธ๋Ÿด๋“ฏํ•œ URL๊ณผ ํ•จ๊ป˜ 403 Forbidden ์ด ํ‘œ์‹œ๋จ

์—ฌ๊ธฐ์„œ ์ฒ˜์Œ ๋ˆˆ์—ฌ๊ฒจ๋ด์•ผ ํ•  ๊ฒŒ ์žˆ๋‹ค โ€” ์ง„์งœ ๋ธŒ๋ผ์šฐ์ € ์ฃผ์†Œ์ฐฝ(์œ„์ชฝ, Chrome ์ž์ฒด์˜ ๊ฒƒ)๊ณผ ํŽ˜์ด์ง€ ์•ˆ์— HTML/CSS๋กœ ๊ทธ๋ ค์ง„ ๊ฐ€์งœ ์ฃผ์†Œ์ฐฝ(ํฐ ๋ฐฐ๊ฒฝ์˜ "๋ธŒ๋ผ์šฐ์ € ํฌ๋กฌ" ๋ชฉ์—…)์€ ์„œ๋กœ ๋‹ค๋ฅธ ๊ฒƒ์ด๋‹ค. securevault.dreamhack.games/secret์€ ์‹ค์ œ๋กœ ์š”์ฒญ์ด ๊ฐ€๋Š” ์ฃผ์†Œ๊ฐ€ ์•„๋‹ˆ๋ผ, ๊ทธ๋ƒฅ ํ™”๋ฉด์— ์ ํžŒ ํ…์ŠคํŠธ์ผ ๋ฟ์ด๋‹ค.


โ–ถ๐Ÿ•ณ๏ธ ์‚ฝ์งˆ โ€” ์ œ๋ชฉ์ด ์‹œํ‚จ ๋Œ€๋กœ 403 ์šฐํšŒ ๊ธฐ๋ฒ•์„ ์ˆœ์„œ๋Œ€๋กœ ์‹œ๋„ํ•ด๋ดค๋‹ค

์ œ๋ชฉ์ด "403 forbidden error"์ด๋‹ˆ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ํ”ํ•œ 403 ์šฐํšŒ ๊ธฐ๋ฒ•๋ถ€ํ„ฐ ํ•˜๋‚˜์”ฉ ์‹œ๋„ํ–ˆ๋‹ค. /secret์ด ํ™”๋ฉด์— ์ ํžŒ "๋ณดํ˜ธ๋œ ๊ฒฝ๋กœ"์ฒ˜๋Ÿผ ๋ณด์˜€์œผ๋‹ˆ, ๊ทธ ๊ฒฝ๋กœ๋ฅผ ์ง์ ‘ ๋‘๋“œ๋ฆฌ๋Š” ๊ฒƒ๋ถ€ํ„ฐ ์‹œ์ž‘ํ–ˆ๋‹ค.

$ curl -s -o /dev/null -w '%{http_code}' http://host3.dreamhack.games:PORT/secret
404

403์ด ์•„๋‹ˆ๋ผ 404๋‹ค. ์ด๋ฏธ ์—ฌ๊ธฐ์„œ ์ด์ƒํ•œ ์‹ ํ˜ธ์˜€์ง€๋งŒ, ์ผ๋‹จ ํ”ํ•œ ํ—ค๋” ์Šคํ‘ธํ•‘ ๊ธฐ๋ฒ•๋“ค์„ ๊ณ„์† ์‹œ๋„ํ–ˆ๋‹ค โ€” ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ๊ฐ€ ๋‚ด๋ถ€ IP๋ฅผ ์‹ ๋ขฐํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ๋…ธ๋ฆฌ๋Š” X-Forwarded-For, ๊ทธ๋ฆฌ๊ณ  ์ผ๋ถ€ WAF/ํ”„๋ก์‹œ ๊ตฌ์„ฑ์—์„œ ์‹ค์ œ ์š”์ฒญ ๊ฒฝ๋กœ ๋Œ€์‹  ์ฐธ์กฐ๋˜๋Š” X-Original-URL ํ—ค๋”๊นŒ์ง€.

ํ„ฐ๋ฏธ๋„ ์บก์ณ โ€” /secret ๋‹จ๋… ์š”์ฒญ, X-Forwarded-For: 127.0.0.1 ํ—ค๋”๋ฅผ ์ถ”๊ฐ€ํ•œ ์š”์ฒญ, X-Original-URL: /secret ํ—ค๋”๋ฅผ ์ถ”๊ฐ€ํ•œ ์š”์ฒญ, /api/flag ๊ฒฝ๋กœ ํƒ์ƒ‰๊นŒ์ง€ ์ „๋ถ€ 404๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒฐ๊ณผ

์ „๋ถ€ 404. ์–ด๋–ค ์กฐํ•ฉ์„ ์‹œ๋„ํ•ด๋„ ๊ฒฐ๊ณผ๊ฐ€ ๋ฐ”๋€Œ์ง€ ์•Š์•˜๋‹ค. ์ด ์‹œ์ ์—์„œ ๊ฒฐ๋ก ์„ ๋’ค์ง‘์—ˆ๋‹ค โ€” /secret์€ ์šฐํšŒํ•ด์•ผ ํ•  "๋ณดํ˜ธ๋œ ์ž๋ฃŒ"๊ฐ€ ์•„๋‹ˆ๋ผ, ์• ์ดˆ์— ๋ฐฑ์—”๋“œ์— ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒฝ๋กœ์˜€๋‹ค. ํ™”๋ฉด์— ๊ทธ๋ ค์ง„ ๊ฐ€์งœ ์ฃผ์†Œ์ฐฝ์˜ ํ…์ŠคํŠธ์ผ ๋ฟ, ์‹ค์ œ ๋ผ์šฐํŒ…๊ณผ๋Š” ๋ฌด๊ด€ํ•œ ์†Œํ’ˆ์ด์—ˆ๋˜ ๊ฒƒ์ด๋‹ค. ๋ฌธ์ œ ์ œ๋ชฉ์ด ๋งŒ๋“  ์„ ์ž…๊ฒฌ("403์ด๋‹ˆ๊นŒ ํ—ค๋” ์šฐํšŒ๊ฒ ์ง€")์ด ์ •ํ™•ํžˆ ์—ฌ๊ธฐ์„œ ๋ฐœ๋ชฉ์„ ์žก์•˜๋‹ค โ€” ์ง„์งœ ์ทจ์•ฝ์ ์€ /secret์ด ์•„๋‹ˆ๋ผ ์ „ํ˜€ ๋‹ค๋ฅธ ์—”๋“œํฌ์ธํŠธ์— ์žˆ์—ˆ๋‹ค.


๐Ÿ’ฃ ํ•ต์‹ฌ โ€” ํ™”๋ฉด์˜ ๋…ผ๋ฆฌ์™€ ์„œ๋ฒ„์˜ ๊ฒ€์ฆ์€ ๋ณ„๊ฐœ๋‹ค

/flag๋ผ๋Š” ๊ฒฝ๋กœ๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฑด ํŽ˜์ด์ง€์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋ณด๋ฉด ๋ฐ”๋กœ ์•Œ ์ˆ˜ ์žˆ๋‹ค. view-source:๋กœ ํŽ˜์ด์ง€ ์†Œ์Šค๋ฅผ ์—ด์–ด๋ดค๋‹ค.

view-source๋กœ ์—ฐ ํŽ˜์ด์ง€ ์†Œ์Šค ์ƒ๋‹จ๋ถ€ โ€” HTML/CSS๋กœ ์งœ์ธ ๊ฐ€์งœ ๋ธŒ๋ผ์šฐ์ € ํฌ๋กฌ ๋งˆํฌ์—…์ด ๊ทธ๋Œ€๋กœ ๋…ธ์ถœ๋จ

์Šคํฌ๋กค์„ ๋‚ด๋ ค <script> ํƒœ๊ทธ๋ฅผ ํ™•์ธํ–ˆ๋‹ค.

ํŽ˜์ด์ง€ ํ•˜๋‹จ์˜ script ํƒœ๊ทธ โ€” MutationObserver๊ฐ€ #statusCode ์š”์†Œ์˜ ํ…์ŠคํŠธ๊ฐ€ 200์ด ๋˜๋Š” ์ˆœ๊ฐ„์„ ๊ฐ์ง€ํ•ด POST /flag ์š”์ฒญ์„ fetch๋กœ ๋ณด๋‚ด๊ณ , ์‘๋‹ต์˜ flag ๊ฐ’์„ ์„ฑ๊ณต ํ™”๋ฉด์— ํ‘œ์‹œํ•˜๋Š” ๋กœ์ง์ด ๊ทธ๋Œ€๋กœ ๋ณด์ž„

๋กœ์ง์„ ์ •๋ฆฌํ•˜๋ฉด ์ด๋ ‡๋‹ค.

const statusEl = document.getElementById("statusCode");
new MutationObserver(() => {
  if (statusEl.textContent.trim() === "200") {
    fetch("/flag", {
      method: "POST",
      headers: { "Content-Type": "application/json" },
      body: JSON.stringify({ status: "200" })
    })
    .then(r => r.json())
    .then(data => {
      if (data.flag) { /* ์„ฑ๊ณต ํ™”๋ฉด ํ‘œ์‹œ */ }
    });
  }
}).observe(statusEl, { childList: true, subtree: true, characterData: true });

#statusCode(ํ™”๋ฉด์— ํผ์ง€๋ง‰ํ•˜๊ฒŒ ๋ณด์ด๋Š” "403" ํ…์ŠคํŠธ)์˜ ๋‚ด์šฉ์ด "200"์œผ๋กœ ๋ฐ”๋€Œ๋Š” ์ˆœ๊ฐ„์„ MutationObserver๊ฐ€ ๊ฐ์ง€ํ•ด์„œ, ๊ทธ๋•Œ /flag์— POST ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ  ์‘๋‹ต์œผ๋กœ ๋ฐ›์€ flag ๊ฐ’์„ ํ™”๋ฉด์— ํ‘œ์‹œํ•œ๋‹ค. ๊ทธ๋Ÿด๋“ฏํ•œ "ํด๋ผ์ด์–ธํŠธ๊ฐ€ 200์„ ๋งŒ๋“ค์–ด๋‚ด๋ฉด ์„œ๋ฒ„๊ฐ€ ์ธ์ •ํ•ด์ค€๋‹ค"๋Š” ํ๋ฆ„์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ, ์ •์ž‘ ์ € ํ…์ŠคํŠธ๋ฅผ ์‹ค์ œ๋กœ "200"์œผ๋กœ ๋ฐ”๊พธ๋Š” ์ฝ”๋“œ๋Š” ํŽ˜์ด์ง€ ์–ด๋””์—๋„ ์—†๋‹ค. ์ฆ‰ ์ด MutationObserver๋Š” ํ•œ ๋ฒˆ๋„ ์ž๋™์œผ๋กœ ๋ฐœ๋™ํ•  ์ผ์ด ์—†๋Š”, ์ˆœ์ˆ˜ํ•˜๊ฒŒ ์—ฐ์ถœ์šฉ์œผ๋กœ ์‹ฌ์–ด๋‘” ์žฅ์‹์ด๋‹ค.

์—ฌ๊ธฐ์„œ ํ•ต์‹ฌ์„ ์งš์–ด์•ผ ํ•œ๋‹ค. ์ด ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ํ•˜๋Š” ์ผ์˜ ๋ณธ์งˆ์€ ๊ฒฐ๊ตญ **"์–ด๋–ค ์กฐ๊ฑด์ด ๊ฐ–์ถฐ์ง€๋ฉด /flag์— {"status": "200"}์ด๋ผ๋Š” JSON์„ ๋‹ด์•„ POST๋ฅผ ๋ณด๋‚ธ๋‹ค"**๋Š” ๊ฒƒ๋ฟ์ด๋‹ค. ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๊ทธ ์กฐ๊ฑด์„ ์Šค์Šค๋กœ ํŒ๋‹จํ•ด์„œ ์š”์ฒญ์„ ๋ณด๋‚ด๋“ , ์šฐ๋ฆฌ๊ฐ€ ๊ทธ๋ƒฅ curl๋กœ ๋˜‘๊ฐ™์€ ์š”์ฒญ์„ ์ง์ ‘ ๋ณด๋‚ด๋“ , ์„œ๋ฒ„ ์ž…์žฅ์—์„œ๋Š” ์™„์ „ํžˆ ๋™์ผํ•œ HTTP ์š”์ฒญ์ด๋‹ค. DOM ์ƒํƒœ๋‚˜ ์„ธ์…˜, ์–ด๋–ค ํŽ˜์ด์ง€์—์„œ ์™”๋Š”์ง€(Referer) ๊ฐ™์€ "์š”์ฒญ์ด ๋‚˜์˜จ ๋งฅ๋ฝ"์„ ์„œ๋ฒ„๊ฐ€ ์ „ํ˜€ ๊ฒ€์ฆํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด, ๊ทธ ์š”์ฒญ์€ ๋ˆ„๊ตฌ๋‚˜ ๊ทธ๋Œ€๋กœ ์žฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ „์ฒด ํ’€์ด ํ๋ฆ„ ๋‹ค์ด์–ด๊ทธ๋žจ โ€” ๊ฐ€์งœ ๋ธŒ๋ผ์šฐ์ € ๋ชฉ์—…์ด ๋งŒ๋“œ๋Š” ์ฐฉ์‹œ, ๊ณ ์ „์  403 ์šฐํšŒ ์‹œ๋„์˜ ๋ฌด์˜๋ฏธํ•จ, view-source๋กœ ๋ฐœ๊ฒฌํ•œ ์Šคํฌ๋ฆฝํŠธ์˜ ์ง„์งœ ์˜๋ฏธ, curl๋กœ ๊ทธ fetch๋ฅผ ๊ทธ๋Œ€๋กœ ์žฌํ˜„ํ•˜๋Š” 4๋‹จ๊ณ„

๋จผ์ € GET์œผ๋กœ /flag๋ฅผ ์ง์ ‘ ์—ด์–ด๋ดค๋‹ค โ€” ์˜ˆ์ƒ๋Œ€๋กœ POST ์ „์šฉ ์—”๋“œํฌ์ธํŠธ์˜€๋‹ค.

๋ธŒ๋ผ์šฐ์ €๋กœ /flag ๋ฅผ GET ์š”์ฒญํ•˜๋ฉด 405 Method Not Allowed ๊ฐ€ ๋œจ๋Š” ํ™”๋ฉด

๐ŸŽฏ ์ž์ฒด ์™„๊ฒฐ solve

์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋ณด๋‚ด๋Š” ๊ฒƒ๊ณผ ์ •ํ™•ํžˆ ๊ฐ™์€ ์š”์ฒญ์„ curl๋กœ ๊ทธ๋Œ€๋กœ ์žฌํ˜„ํ–ˆ๋‹ค.

$ curl -X POST http://host3.dreamhack.games:PORT/flag \
    -H 'Content-Type: application/json' \
    -d '{"status":"200"}'
ํ„ฐ๋ฏธ๋„ ์บก์ณ โ€” GET slash flag ๋Š” 405๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€๋งŒ, POST slash flag ์— Content-Type: application/json ํ—ค๋”์™€ status 200 ์„ ๋‹ด์€ JSON ๋ฐ”๋””๋ฅผ ์‹ค์–ด ๋ณด๋‚ด๋ฉด ๊ณง๋ฐ”๋กœ flag ๊ฐ’์ด ๋‹ด๊ธด JSON์ด ๋ฐ˜ํ™˜๋จ

DOM์„ ์‹ค์ œ๋กœ ์กฐ์ž‘ํ•  ํ•„์š”๋„, ๋ธŒ๋ผ์šฐ์ €์˜ MutationObserver๊ฐ€ ๋ฐœ๋™ํ•˜๊ธธ ๊ธฐ๋‹ค๋ฆด ํ•„์š”๋„ ์—†์—ˆ๋‹ค โ€” ์„œ๋ฒ„๋Š” ์ด ์š”์ฒญ์ด ์ง„์งœ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์™”๋Š”์ง€, ํ™”๋ฉด์˜ "403"์ด ์ •๋ง "200"์œผ๋กœ ๋ฐ”๋€ ๋’ค์— ์™”๋Š”์ง€ ๊ทธ ์–ด๋–ค ๊ฒƒ๋„ ๊ฒ€์ฆํ•˜์ง€ ์•Š์•˜๋‹ค. ๊ทธ๋ƒฅ ์ด JSON ๋ฐ”๋”” ํ•˜๋‚˜๋งŒ ๋ณด๊ณ  flag๋ฅผ ๋‚ด์คฌ๋‹ค.

๊ฐ™์€ ์š”์ฒญ์„ ๋ธŒ๋ผ์šฐ์ € ์ฝ˜์†”์—์„œ ์ง์ ‘ ์‹คํ–‰ํ•ด๋„ ๋ฌผ๋ก  ๋™์ผํ•˜๊ฒŒ ๋™์ž‘ํ•œ๋‹ค โ€” ๊ฐœ๋ฐœ์ž ๋„๊ตฌ ์—†์ด๋„, ๊ทธ๋ƒฅ #statusCode์˜ ํ…์ŠคํŠธ๋ฅผ ๊ฐ•์ œ๋กœ ๋ฐ”๊ฟ”์„œ ์›๋ž˜ ์˜๋„๋œ MutationObserver ํ๋ฆ„์„ ์‹ค์ œ๋กœ ํŠธ๋ฆฌ๊ฑฐํ•ด๋ดค๋‹ค.

๋ธŒ๋ผ์šฐ์ € ์ฝ˜์†”์—์„œ document.getElementById('statusCode').textContent = '200' ์„ ์‹คํ–‰ํ•˜๋ฉด MutationObserver๊ฐ€ ๊ฐ์ง€ํ•ด ์‹ค์ œ๋กœ POST /flag ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ , ์‘๋‹ต์œผ๋กœ ๋ฐ›์€ ์ง„์งœ flag๊ฐ€ Access Granted! ํ™”๋ฉด์— ๊ทธ๋Œ€๋กœ ํ‘œ์‹œ๋จ

MutationObserver๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ๋ฐœ๋™ํ•˜๋ฉด์„œ ์ง„์งœ /flag ์‘๋‹ต์„ ๋ฐ›์•„์™€ "Access Granted!" ํ™”๋ฉด๊ณผ ํ•จ๊ป˜ flag๋ฅผ ํ‘œ์‹œํ•œ๋‹ค โ€” curl๋กœ ์ง์ ‘ ๋ณด๋‚ธ ๊ฒƒ๊ณผ ์„œ๋ฒ„ ์‘๋‹ต์€ ์™„์ „ํžˆ ๋™์ผํ–ˆ๋‹ค.

DH{afjqofuida34@1!21%!1204m1n13aax091!kJ@$}

flag์— ํŠน์ˆ˜๋ฌธ์ž(!, @, %, $)๊ฐ€ ๋งŽ์•„ ์ „๋‹ฌ ๊ณผ์ •์—์„œ ๊นจ์งˆ ์ˆ˜ ์žˆ์œผ๋‹ˆ, ์„œ๋ฒ„์—์„œ flag๋ฅผ ๋‹ค์‹œ ์กฐํšŒํ•ด ์ •ํ™•ํžˆ ๊ฐ™์€ ๋ฌธ์ž์—ด์ธ์ง€ ํ™•์ธํ•œ ๋’ค ์ œ์ถœํ–ˆ๋‹ค. "์ •๋‹ต! ํ•ด๊ฒฐ ์ฒ˜๋ฆฌ๋จ".


๐Ÿ“ ๊ฒฐ๋ก 

์ด ๋ฌธ์ œ๊ฐ€ ์งš์–ด์ค€ ์ง€์ ์€ ๋‘ ๊ฐ€์ง€์˜€๋‹ค.

  • ๋ฌธ์ œ(๋˜๋Š” ํ™”๋ฉด) ์ œ๋ชฉ์ด ๋งŒ๋“œ๋Š” ์„ ์ž…๊ฒฌ์„ ์˜์‹ฌ ์—†์ด ๋ฐ›์•„๋“ค์ด๋ฉด ์•ˆ ๋œ๋‹ค. "403 forbidden"์ด๋ผ๋Š” ์ œ๋ชฉ๊ณผ ๊ทธ๋Ÿด๋“ฏํ•œ ๋ชฉ์—… ํ™”๋ฉด์€ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ "ํ—ค๋” ์šฐํšŒ"๋ผ๋Š” ์ต์ˆ™ํ•œ ์นดํ…Œ๊ณ ๋ฆฌ๋กœ ์‚ฌ๊ณ ๋ฅผ ๋ชฐ์•„๊ฐ„๋‹ค. ํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒฝ๋กœ(/secret)๋ฅผ ๋Œ€์ƒ์œผ๋กœ ์•„๋ฌด๋ฆฌ ์ •๊ตํ•œ ์šฐํšŒ ๊ธฐ๋ฒ•์„ ์‹œ๋„ํ•ด๋„ ๊ฒฐ๊ณผ๋Š” ๋ฐ”๋€Œ์ง€ ์•Š๋Š”๋‹ค โ€” ๋ช‡ ๋ฒˆ์˜ ์š”์ฒญ์œผ๋กœ "์šฐํšŒํ•  ๋Œ€์ƒ์ด ์ง„์งœ๋กœ ์กด์žฌํ•˜๋Š”๊ฐ€" ์ž์ฒด๋ฅผ ๋จผ์ € ํ™•์ธํ•˜๋Š” ์Šต๊ด€์ด, ์—‰๋šฑํ•œ ๋ฐฉํ–ฅ์œผ๋กœ ์‹œ๊ฐ„์„ ์“ฐ๋Š” ๊ฑธ ๋ง‰์•„์ค€๋‹ค.
  • ํด๋ผ์ด์–ธํŠธ๊ฐ€ "์ด ์กฐ๊ฑด์ด ์ถฉ์กฑ๋˜๋ฉด ์ด ์š”์ฒญ์„ ๋ณด๋‚ธ๋‹ค"๋Š” ๋กœ์ง์„ ๊ฐ–๊ณ  ์žˆ๋‹ค๋ฉด, ๊ทธ ์กฐ๊ฑด ์ž์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ ์ตœ์ข…์ ์œผ๋กœ ๋‚˜๊ฐ€๋Š” ์š”์ฒญ์ด ์ง„์งœ ๊ณต๊ฒฉ ํ‘œ๋ฉด์ด๋‹ค. ์ด ๋ฌธ์ œ์˜ MutationObserver๋Š” "๋ธŒ๋ผ์šฐ์ € DOM์ด ์–ด๋–ค ์ƒํƒœ๊ฐ€ ๋˜์–ด์•ผ๋งŒ" ์š”์ฒญ์ด ๋‚˜๊ฐ€๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๊ฒŒ ์„ค๊ณ„๋ผ ์žˆ์—ˆ์ง€๋งŒ, ์„œ๋ฒ„๋Š” ๊ทธ ์š”์ฒญ์ด ์–ด๋–ค ๊ฒฝ๋กœ๋กœ ๋งŒ๋“ค์–ด์กŒ๋Š”์ง€ ์ „ํ˜€ ๋ชจ๋ฅธ๋‹ค โ€” HTTP ์š”์ฒญ์€ ๊ทธ ์ž์ฒด๋กœ ์™„์ „ํ•œ ๊ฒƒ์ด๊ณ , ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์–ด๋–ค ์กฐ๊ฑด ํ•˜์— ๊ทธ๊ฑธ ๋ณด๋ƒˆ๋Š”์ง€๋Š” ์„œ๋ฒ„์—๊ฒŒ ์•„๋ฌด ์˜๋ฏธ๊ฐ€ ์—†๋‹ค. ํด๋ผ์ด์–ธํŠธ ๋กœ์ง์ด ์•„๋ฌด๋ฆฌ ๋ณต์žกํ•ด ๋ณด์—ฌ๋„, ์„œ๋ฒ„๊ฐ€ ์ตœ์ข… ์š”์ฒญ์˜ ๋‚ด์šฉ๋งŒ ๊ฒ€์ฆํ•œ๋‹ค๋ฉด ๊ทธ ์š”์ฒญ์€ ๊ทธ๋Œ€๋กœ ์žฌํ˜„ ๊ฐ€๋Šฅํ•˜๋‹ค.
  • "์ •๋‹ต ํŒ์ •"์ด ํด๋ผ์ด์–ธํŠธ ์ฃผ๋„๋กœ ๋ณด์ด๋Š” UX์ผ์ˆ˜๋ก, ์„œ๋ฒ„ ์ชฝ ๊ฒ€์ฆ์ด ์‹ค์ œ๋กœ ์–ด๋””๊นŒ์ง€์ธ์ง€ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค. ์ด๋ฒˆ ์—”๋“œํฌ์ธํŠธ๋Š” body์˜ status ํ•„๋“œ ์กด์žฌ ์—ฌ๋ถ€์กฐ์ฐจ ์˜๋ฏธ ์žˆ๊ฒŒ ๊ฒ€์‚ฌํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์˜€๋‹ค โ€” ์ง„์งœ ํ•„์š”ํ•œ ๊ฑด ์„ธ์…˜์ด๋‚˜ ์ด์ „ ์š”์ฒญ ์ด๋ ฅ์— ๊ธฐ๋ฐ˜ํ•œ ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ์ƒํƒœ ๊ฒ€์ฆ์ด์—ˆ์„ ํ…๋ฐ, ๊ทธ๊ฒŒ ์ „ํ˜€ ์—†์—ˆ๋‹ค.

๋ฐฉ์–ด์ž ๊ด€์ ์—์„œ ๋ณด๋ฉด ์ด ๋ฌธ์ œ๋Š” ๋‹จ์ˆœํ•˜์ง€๋งŒ ์‹ค๋ฌด์—์„œ ์‹ค์ œ๋กœ ๋ฐ˜๋ณต๋˜๋Š” ํŒจํ„ด์„ ์ •ํ™•ํžˆ ์งš๋Š”๋‹ค โ€” "์ ‘๊ทผ ์ œ์–ด"์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ํ™”๋ฉด ์—ฐ์ถœ๊ณผ ์‹ค์ œ ์ ‘๊ทผ ์ œ์–ด๋Š” ๋‹ค๋ฅด๋‹ค. ํ”„๋ก ํŠธ์—”๋“œ์—์„œ ์•„๋ฌด๋ฆฌ ๊ทธ๋Ÿด๋“ฏํ•œ ์กฐ๊ฑด๋ถ€ UI๋ฅผ ๋งŒ๋“ค์–ด๋„, ๊ทธ UI๊ฐ€ ํŠธ๋ฆฌ๊ฑฐํ•˜๋Š” API ์—”๋“œํฌ์ธํŠธ ์ž์ฒด๊ฐ€ ๋ณ„๋„์˜ ์ธ์ฆ/์ธ๊ฐ€ ๊ฒ€์ฆ ์—†์ด ์—ด๋ ค ์žˆ๋‹ค๋ฉด ๊ทธ UI๋Š” ์žฅ์‹์ผ ๋ฟ์ด๋‹ค. /flag ๊ฐ™์€ ๋ฏผ๊ฐํ•œ ์—”๋“œํฌ์ธํŠธ๋Š” ์š”์ฒญ์˜ "ํ˜•ํƒœ"๊ฐ€ ์•„๋‹ˆ๋ผ ์š”์ฒญ์„ ๋ณด๋‚ธ ์ฃผ์ฒด(์„ธ์…˜, ํ† ํฐ, ์ด์ „ ๋‹จ๊ณ„์˜ ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ์ƒํƒœ)๋ฅผ ๊ฒ€์ฆํ•ด์•ผ ํ•œ๋‹ค.

์ด ๊ธ€์ด ๋„์›€์ด ๋๋‚˜์š”?

Comments

๋Œ“๊ธ€

0๊ฐœ

๋Œ“๊ธ€์„ ๋‚จ๊ธฐ๋ ค๋ฉด ๋กœ๊ทธ์ธ์ด ํ•„์š”ํ•ด์š”. (๋„ค์ด๋ฒ„ ยท ๊ตฌ๊ธ€ ๊ณ„์ •)

๋Œ“๊ธ€ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์ค‘โ€ฆ

Related

๊ด€๋ จ ๊ธ€

3๊ฐœ
[๐Ÿฅ‰ Bronze 3] X-UserยทReferer ํ—ค๋” ์œ„์กฐ๋กœ ๋น„๋ฐ€ ๋ฌธ์„œ ์ฝ๊ธฐ โ€” DreamHack DreamDocs ํ’€์ด
blog

[๐Ÿฅ‰ Bronze 3] X-UserยทReferer ํ—ค๋” ์œ„์กฐ๋กœ ๋น„๋ฐ€ ๋ฌธ์„œ ์ฝ๊ธฐ โ€” DreamHack DreamDocs ํ’€์ด

๋ฌธ์„œ ์—ด๋žŒ ๊ถŒํ•œ์„ Referer์™€ X-User ํ—ค๋”๋กœ๋งŒ ํŒ๋‹จํ•˜๋Š” ๊ฒŒ์‹œํŒ์ด๋‹ค. ๋‘˜ ๋‹ค ์š”์ฒญ์ž๊ฐ€ ๋งˆ์Œ๋Œ€๋กœ ๋ณด๋‚ด๋Š” ๊ฐ’์ด๋ผ, X-User: admin ๊ณผ Referer: /share ๋ฅผ ์œ„์กฐํ•˜๋ฉด confidential ๋ฌธ์„œ์˜ ๋ณธ๋ฌธ(FLAG)์ด ๊ทธ๋Œ€๋กœ ์—ด๋ฆฐ๋‹ค.
#dreamhack#ctf#web+6
2026-06-04#dreamhack +4
[๐Ÿฅ‰ Bronze 3] ๋šซ์„ ํ•„์š”๊ฐ€ ์—†์—ˆ๋‹ค, ์ œ๋Œ€๋กœ ๋ณด๊ธฐ๋งŒ ํ•˜๋ฉด ๋๋‹ค โ€” DreamHack [wargame.kr] already got ํ’€์ด
blog

[๐Ÿฅ‰ Bronze 3] ๋šซ์„ ํ•„์š”๊ฐ€ ์—†์—ˆ๋‹ค, ์ œ๋Œ€๋กœ ๋ณด๊ธฐ๋งŒ ํ•˜๋ฉด ๋๋‹ค โ€” DreamHack [wargame.kr] already got ํ’€์ด

์˜› wargame.kr์—์„œ ๋ฆฌ๋งˆ์Šคํ„ฐํ•ด ๊ฐ€์ ธ์˜จ ๋ฌธ์ œ. ํŽ˜์ด์ง€๋ฅผ ์—ด์–ด๋ณด๋ฉด "you've already got key! :p"๋ผ๋Š” ํ•œ ์ค„์งœ๋ฆฌ ๋ฌธ๊ตฌ๋ฟ์ด๊ณ , HTML ์†Œ์Šค๋ฅผ ๋ด๋„ ๋˜‘๊ฐ™๋‹ค. ๋ฌธ์ œ ์„ค๋ช…์ด "HTTP ์‘๋‹ต ํ—ค๋”๊ฐ€ ๋ณด์ด๋‚˜์š”?"๋ผ๊ณ  ๋Œ€๋†“๊ณ  ํžŒํŠธ๋ฅผ ์ฃผ๋Š”๋ฐ, ์ด ์งง์€ ๋ฌธ์ œ ํ•˜๋‚˜๊ฐ€ ์‚ฌ์‹ค "๋ธŒ๋ผ์šฐ์ € ํ™”๋ฉด์— ๋ณด์ด๋Š” ๊ฒƒ"๊ณผ "์„œ๋ฒ„๊ฐ€ ์‹ค์ œ๋กœ ๋ณด๋‚ธ ๊ฒƒ"์ด ๋‹ค๋ฅด๋‹ค๋Š” ์›น ๋ฆฌ๋ฒ„์‹ฑ์˜ ๊ฐ€์žฅ ๊ธฐ์ดˆ์ ์ธ ๊ตํ›ˆ์„ ์ •ํ™•ํžˆ ์งš๊ณ  ์žˆ์—ˆ๋‹ค. ์ทจ์•ฝ์ ์„ ์ฐพ์•„ ๋šซ๋Š” ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ๋ผ, HTTP ํ”„๋กœํ† ์ฝœ์„ ์žˆ๋Š” ๊ทธ๋Œ€๋กœ ๊ด€์ฐฐํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋˜๋Š” ๋ฌธ์ œ์˜€๋‹ค.
#dreamhack#ctf#web+3
2026-07-21#dreamhack +3
[๐Ÿฅ‰ Bronze 4] ๋ฒ„ํŠผ์„ ์ซ“์•„๊ฐˆ ํ•„์š”๊ฐ€ ์—†์—ˆ๋‹ค โ€” DreamHack Click me! ํ’€์ด
blog

[๐Ÿฅ‰ Bronze 4] ๋ฒ„ํŠผ์„ ์ซ“์•„๊ฐˆ ํ•„์š”๊ฐ€ ์—†์—ˆ๋‹ค โ€” DreamHack Click me! ํ’€์ด

๋งˆ์šฐ์Šค๊ฐ€ ๊ฐ€๊นŒ์ด ๊ฐ€๋ฉด ๋„๋ง๊ฐ€๋Š” ๋ฒ„ํŠผ. "Catch me if you can!"์ด๋ผ๋Š” ๋ฌธ์ œ ์„ค๋ช… ๊ทธ๋Œ€๋กœ, ๊ฒ‰๋ณด๊ธฐ์—” ๋ฐ˜์‘์†๋„์™€ ํด๋ฆญ ํƒ€์ด๋ฐ์„ ๊ฒจ๋ฃจ๋Š” ๋ฏธ๋‹ˆ๊ฒŒ์ž„ ๊ฐ™๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๋ฒ„ํŠผ์˜ ํด๋ฆญ ์ด๋ฒคํŠธ๊ฐ€ ํ•˜๋Š” ์ผ์ด๋ผ๊ณค ํŠน์ • URL๋กœ ์ด๋™ํ•˜๋Š” ๊ฒƒ๋ฟ์ด๊ณ , ๊ทธ URL์— ์„œ๋ฒ„๊ฐ€ ์–ด๋–ค ์กฐ๊ฑด๋„ ๊ฒ€์ฆํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฑธ ์†Œ์Šค์—์„œ ํ™•์ธํ•œ ์ˆœ๊ฐ„, ๋ฒ„ํŠผ์„ ์ซ“์•„๋‹ค๋‹ ์ด์œ  ์ž์ฒด๊ฐ€ ์‚ฌ๋ผ์กŒ๋‹ค.
#dreamhack#ctf#web+2
2026-07-20#dreamhack +3