https://dreamhack.io/wargame/challenges/873
[1] ๋ฌธ์ ํ์ด
๋ฌธ์ ์ค๋ช ์ ๋ค์ ๋ณด์๋ฉด,
์ด๋ฌํ๋ค!
๊ทธ๋ฌ๋๊น php๋ก ์์ฑํ ํ์ด์ง์ ์ ์์ ํ๋ฉด, Ncickname๊ณผ Password๋ฅผ ์ ๋ ฅํ ์ ์๋ ํ๋ฉด์ด ๋์จ๋ค.
๋จผ์ ์๋ง์ Nickname๊ณผ Password๋ฅผ ์ ๋ ฅํ์ฌ Step 2๋ก ๋์ด๊ฐ๋ณด์!
Step 1 ํ์ด์ง์ ์์ค์ฝ๋ ํ์ด์ง๋ฅผ ์ดํด๋ณด์๋๋ฐ ๋ณ ๊ฒ ์์ด์ ๋ฌธ์ ํ์ผ์ ์ดํด๋ณด์๋ค,
index.php๋ ์์ ๋ฌธ์ ํ์ด์ง ์์ค์ฝ๋ ํ์ผ๊ณผ ๋ด์ฉ์ด ๋๊ฐ์๋ค.
๋ค์์ step2.php ํ์ผ์ ๋ด์ฉ์ด๋ค.
<html>
<head>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css">
<title>PHPreg</title>
</head>
<body>
<!-- Fixed navbar -->
<nav class="navbar navbar-default navbar-fixed-top">
<div class="container">
<div class="navbar-header">
<a class="navbar-brand" href="/">PHPreg</a>
</div>
<div id="navbar">
<ul class="nav navbar-nav">
<li><a href="/">Step 1</a></li>
<li><a href="/step2.php">Step 2</a></li>
</ul>
</div><!--/.nav-collapse -->
</div>
</nav><br/><br/><br/>
<div class="container">
<div class="box">
<!-- PHP code -->
<?php
// POST request
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$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") {
echo '<h4>Step 2 : Almost done...</h4><div class="door_box"><div class="door_black"></div><div class="door"><div class="door_cir"></div></div></div>';
$cmd = $_POST["cmd"] ? $_POST["cmd"] : "";
if ($cmd === "") {
echo '
<p><form method="post" action="/step2.php">
<input type="hidden" name="input1" value="'.$input_name.'">
<input type="hidden" name="input2" value="'.$input_pw.'">
<input type="text" placeholder="Command" name="cmd">
<input type="submit" value="์ ์ถ"><br/><br/>
</form></p>
';
}
// cmd filtering
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";
}
}
}
// GET request
else{
echo "Not GET request";
}
?>
</div>
</div>
<style type="text/css">
h4 {
color: rgb(84, 84, 84);
}
.box{
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
pre {
width: 80%;
}
.door_box {
position: relative;
width: 240px;
height: 180px;
margin: 20px 0px;
}
.door_black {
position: absolute;
width: 140px;
height: 180px;
background-color: black;
border-radius: 10px;
right:0px;
}
.door {
z-index: 2;
position: absolute;
width: 140px;
height: 180px;
background-color: #b9abf7;
border-radius: 10px;
right: 100px;
}
.door_cir{
z-index: 3;
position: absolute;
border-radius: 50%;
width: 20px;
height: 20px;
border: 2px solid rgba(255, 222, 113, 0.873);
background-color: #ffea98;
top: calc( 180px / 2 - 10px );
right: 10px;
}
</style>
</body>
</html>
"<?php"๋ก ์์ํ๋ php ๋ฌธ ์์ ๋ถ๋ถ์ด ๋์ ๋๋ค.
๋ค์์ step2.php ํ์ผ ๋ด์ฉ์ ์ผ๋ถ์ด๋ค.
<?php
// POST request
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$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") {
echo '<h4>Step 2 : Almost done...</h4><div class="door_box"><div class="door_black"></div><div class="door"><div class="door_cir"></div></div></div>';
php ๋ฌธ๋ฒ์ ์ดํดํ๊ธฐ ์ํด, preg match() ํจ์์ preg_replace() ํจ์์ ๋ํด ์ฐพ์๋ณด์๋ค.
โญ preg_match() ํจ์๋?
์ฃผ์ด์ง ์ ๊ท ํํ์ ํจํด์ ์ฌ์ฉํ์ฌ ๋ฌธ์์ด ๋ด์์ ์ผ์น(match)ํ๋ ๋ถ๋ถ์ ์ฐพ์๋ด๋ ํจ์์ด๋ค.
ํน์ง
- ์ผ์นํ๋ ํจํด์ ๋ฌธ์์ด์์ ์ฒ์์ผ๋ก ๋ฐ๊ฒฌํ๋ฉด ๊ฒ์์ ์ค๋จํ๊ณ 1์ ๋ฐํํ๋ค.
- ์ผ์นํ๋ ํจํด์ ์ฐพ์ง ๋ชปํ๋ฉด 0์ ๋ฐํํ๋ค.
- ์๋ฌ๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ false๋ฅผ ๋ฐํํ๋ค.
- ์ด๋ฉ์ผ ์ฃผ์, ์ ํ๋ฒํธ, URL๊ณผ ๊ฐ์ ํน์ ํจํด์ ๋ฌธ์์ด์ ๊ฒ์ฌํ ๋ ์ฃผ๋ก ์ฌ์ฉํ๋ค.
- ๋ฌธ์์ด์์ ํน์ ํจํด์ ๊ฒ์ํ๊ฑฐ๋ ๋ฌธ์์ด์์ ํน์ ํ์์ ๋ฐ์ดํฐ๋ฅผ ์ถ์ถํ๋ ๋ฐ์๋ ์ฌ์ฉํ๋ค.
- ์ฃผ์ํ ์ : ๊ธฐ๋ณธ์ ์ผ๋ก preg_match() ํจ์๋ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํ๋ค. ๋ง์ฝ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํ์ง ์๊ณ ์ถ๋ค๋ฉด ์ ๊ท ํํ์์ /i ํ๋๊ทธ๋ฅผ ์ถ๊ฐํ๋ค.
php_match() ํจ์์ ์์
// ์ ํ๋ฒํธ ์ถ๋ ฅ
$text = '๋ฌธ์์ด์์ ์ ํ๋ฒํธ๋ 010-1234-5678๊ณผ ๊ฐ์ด ๋ํ๋ ์ ์์ต๋๋ค.';
$pattern = "/\b(?:\d{2,3}[-.])?\d{3,4}[-.]\d{4}\b/";
if (preg_match($pattern, $text, $matches)) {
$phoneNumber = $matches[0];
echo '์ถ์ถ๋ ์ ํ๋ฒํธ: ' . $phoneNumber;
} else {
echo '์ ํ๋ฒํธ๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค.';
}
// ์ถ๋ ฅ: '์ถ์ถ๋ ์ ํ๋ฒํธ: 010-1234-5678'
๋ค์ ๋์์์, step2.php์์ ์ฌ์ฉ๋ preg_match ํ์ผ์ ๋ถ์ํด๋ณด์.
if (preg_match("/[a-zA-Z]/", $input_pw)) {
echo "alphabet in the pw :(";
}
์ฌ๊ธฐ์์ ์ฌ์ฉ๋ ์ ๊ท ํํ์์ /[a-zA-Z]/ ์ด๋ค.
[a-zA-Z]๋ ์๋ฌธ์ a๋ถํฐ z๊น์ง ๋๋ ๋๋ฌธ์ A๋ถํฐ Z๊น์ง์ ์ํ๋ฒณ ๋ฌธ์๋ฅผ ์๋ฏธํ๋ค. ์ด ์ ๊ท ํํ์์ ๋ฌธ์์ด์ ์ํ๋ฒณ ๋ฌธ์๊ฐ ํฌํจ๋์ด ์๋์ง๋ฅผ ๊ฒ์ฌํ๋ค.
๋ฐ๋ผ์, ๋ง์ฝ $input_pw ๋ณ์์ ์ํ๋ฒณ ๋ฌธ์๊ฐ ํฌํจ๋์ด ์๋ค๋ฉด, "alphabet in the pw :("๋ฅผ ์ถ๋ ฅํ๋ค.
ํ์ธ์ ์ํด 'admin', 'admin'์ ์ ๋ ฅํด๋ณด์๋ค.
์์์ ์ฝ๋๋ฅผ ๋ถ์ํ์ฌ ์์ํ ๊ฒฐ๊ณผ๋๋ก ๋์๋ค.
์ด์ , preg_replace() ํจ์๋ฅผ ๋ถ์ํด๋ณด์.
โญpreg_replace() ํจ์๋?
preg_replace() ํจ์๋ ์ ๊ท ํํ์์ ์ฌ์ฉํ์ฌ ๋ฌธ์์ด์ ์นํํ๋ ํจ์์ด๋ค. ์ ๊ท ํํ์์ ์ฌ์ฉํ์ฌ ๋ณด๋ค ๋ณต์กํ ์นํ์ ํ ์ ์๋ค.
์ฌ์ฉ๋๋ ์ธ์
$pattern | ์ฐพ์ ์ ๊ท ํํ์ |
$replacement | ์นํํ ๋ฌธ์์ด |
$subject | ๋์ ๋ฌธ์์ด |
$flags | ์ ๊ท ํํ์ ํ๋๊ทธ |
์ฌ์ฉ ์์
// ๋ฌธ์์ด์์ ํน์ ๋ฌธ์๋ฅผ ๋ค๋ฅธ ๋ฌธ์๋ก ์นํ
$str = "Hello, world!";
// "Hello"๋ฅผ "Goodbye"๋ก ์นํ
$str = str_replace("Hello", "Goodbye", $str);
echo $str; // Goodbye, world!
// ๋ฌธ์์ด์์ ํน์ ๋ฌธ์์ด์ ์ ๊ฑฐ
$str = "Hello, world!";
// "Hello"๋ฅผ ์ ๊ฑฐ
$str = str_replace("Hello", "", $str);
echo $str; // world!
// ์ ๊ท ํํ์์ ์ฌ์ฉํ์ฌ ๋ฌธ์์ด์ ์นํ
$str = "Hello, world! 12345";
// "Hello"์ "world"๋ฅผ "Goodbye"๋ก ์นํ
$str = preg_replace("/Hello|world/", "Goodbye", $str);
echo $str; // Goodbye, Goodbye! 12345
๋ค์ ๋์์์ ํ์ธํด๋ณด๋ฉด,
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") {
echo '<h4>Step 2 : Almost done...</h4><div class="door_box"><div class="door_black"></div><div class="door"><div class="door_cir"></div></div></div>';
- $input_name ๋ณ์์์ "nyang"์ด๋ผ๋ ๋ฌธ์์ด์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํ์ง ์๊ณ ์ฐพ์ ์ ๊ฑฐํ ํ, ๊ฒฐ๊ณผ๋ฅผ $name ๋ณ์์ ํ ๋นํ๋ค.
- preg_replace() ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์ ๊ท ํํ์ /nyang/i๋ฅผ ์ ์ฉํ๋ค. ์ฌ๊ธฐ์ /i๋ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํ์ง ์๋๋ก ํ๋ ์ต์
์ด๋ค.
- $input_pw ๋ณ์์์ ํน์ ํ ํจํด์ ์ฐพ์ "d4y0r50ng"์ผ๋ก ๋์ฒดํ ํ, ๊ฒฐ๊ณผ๋ฅผ $pw ๋ณ์์ ํ ๋นํ๋ค.
- preg_replace() ํจ์๋ฅผ ์ฌ์ฉํ๊ณ , ์ ๊ณต๋ ์ ๊ท ํํ์์ ์ ์ฉํ๋ค.
- ๋ง์ฝ $name์ด "dnyang0310"์ด๊ณ , $pw๊ฐ "d4y0r50ng+1+13"๊ณผ ์ ํํ ์ผ์นํ๋ ๊ฒฝ์ฐ: HTML ์ฝ๋๋ฅผ ์ถ๋ ฅํ๋ค.
- ์ถ๋ ฅ๋๋ ๋ด์ฉ์ "Step 2 : Almost done..."์ด๋ฉฐ, ์ด์ด์ ๋ฌธ์ ์ฐ์์ํค๋ ์์๋ค์ด ํฌํจ๋๋ค.
๋จผ์ name์ ๊ฐ์ ๋ํด ์ดํด๋ณด์.
name์ ๊ฐ์ด "dnyang0310"์ด์ด์ผ ํ๋ฏ๋ก, ํํฐ๋ง์ ์ฐํํ๊ธฐ ์ํด
"dnynyangang0310"์ด๋ผ๋ Nickname์ ์
๋ ฅํ๋ฉด ๋ ๊ฒ์ด๋ผ๊ณ ์์ํ๋ค.
nyang์ด ๊ณต๋ฐฑ์ผ๋ก ์นํ๋๋ฉด์ ํํฐ๋ง ๋๊ณ ๊ฒฐ๊ตญ "dnyang0310"๋ง ๋จ๋ ๊ฒ์ด๋ค.
๊ทธ ๋ค์์ผ๋ก๋ pw์ ํํฐ๋ง์ ์ดํด๋ณด์.
$pw = preg_replace("/\d*\@\d{2,3}(31)+[^0-8]!/", "d4y0r50ng", $input_pw);
์์, ์ ๊ท ํํ์์ ํ๋ํ๋ ํด์ฒดํ์ฌ ์ดํด๋ณด์.
\d*
- 0์์ 9๊น์ง์ ๋ฒ์์ ํ ์๋ฆฌ ์ซ์๋ฅผ ์๋ฏธํ๋ค.
- *๋ ๋ฌธ์ ๋๋ ์ซ์๊ฐ 0๊ฐ ์ด์ ๋ํ๋๋ ๊ฒ์ ์๋ฏธํ๋ค.
=> ๋ฐ๋ผ์ 0~9 ์ฌ์ด์ ์ซ์๊ฐ 0๊ฐ ์ด์ ๋ํ๋์ผ ํ๋ค.
\@
- @๋ฅผ ์๋ฏธํ๋ค.
\d{2,3}
- ์ซ์๊ฐ 2๊ฐ ๋๋ 3๊ฐ ์ฐ์๋ฉ๋๋ค.
(31)+
- '31'์ด๋ผ๋ ์ซ์๊ฐ ํ๋ ์ด์ ๋ฐ๋ณต๋๋ค.
[^0-8\"]
- '0'์์ '8' ์ฌ์ด์ ์ซ์ ๋๋ '"' ์ด์ธ์ ๋ฌธ์๋ฅผ ์ฐพ๋๋ค.
\!
- '!' ๊ธฐํธ๋ฅผ ์ฐพ๋๋ค.
==> ์์ ๋ชจ๋ ์์๋ฅผ ์กฐํฉํ์ฌ 1@12319! ๋ผ๋ ๋ฌธ์์ด์ ๋ง๋ค์๋ค.
์ด ๋ฌธ์์ด์ preg_replace() ํจ์์ ์ํด "d4y0r50ng"๋ก ๋ณํ๋ ๊ฒ์ด๋ค.
๋น๋ฐ๋ฒํธ๋ "d4y0r50ng+1+13"์ด ๋์ด์ผ ํ๋ฏ๋ก ๋ค์ "+1+13"๋ฅผ ๋ถ์ฌ
"123@12319!+1+13"์ ๋น๋ฐ๋ฒํธ์ ์ ๋ ฅํด๋ณด์.
์ด๋ ๊ฒ Step2๋ก ๋์ด๊ฐ๊ฒ ๋์๋ค.
$cmd = $_POST["cmd"] ? $_POST["cmd"] : "";
if ($cmd === "") {
echo '
<p><form method="post" action="/step2.php">
<input type="hidden" name="input1" value="'.$input_name.'">
<input type="hidden" name="input2" value="'.$input_pw.'">
<input type="text" placeholder="Command" name="cmd">
<input type="submit" value="์ ์ถ"><br/><br/>
</form></p>
';
}
// cmd filtering
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";
}
}
}
// GET request
else{
echo "Not GET request";
}
?>
์ด์ ๋ ์ด ๋ถ๋ถ์ ์ดํด๋ณด์.
์ฒ์์ ๋ฌธ์ ์ค๋ช ์์
Step 2์์ system() ํจ์๋ฅผ ์ด์ฉํ์ฌ ํ๋๊ทธ๋ฅผ ํ๋ํ์ธ์.
ํ๋๊ทธ๋ ../dream/flag.txt์ ์์นํฉ๋๋ค.
๋ผ๊ณ ํ์๋ค.
๋จผ์ php ๋ฌธ๋ฒ์์์ system ํจ์๋ฅผ ์์๋ณด์.
โญsystem ํจ์๋?
์ธ๋ถ ํ๋ก๊ทธ๋จ์ ์คํํ๊ณ ์ถ๋ ฅ์ ํ์ํ๋ ํจ์์ด๋ค.
system ํจ์์ ๊ธฐ๋ณธ ๊ตฌ๋ฌธ
system(string $command, int &$return_var): string|false
- $command: ์คํํ ๋ช
๋ น์ด๋ฅผ ๋ํ๋ด๋ ๋ฌธ์์ด์ด๋ค.
- &$return_var: ๋ช
๋ น์ด ์คํ ํ์ ์ํ ์ฝ๋๋ฅผ ๋ฐ๋ ๋ฐ ์ฌ์ฉ๋ ๋ณ์์ด๋ค. ์ด ๋ณ์๋ ์ ํ์ ์ผ๋ก ์ ๋ฌ๋ ์ ์๋ค. ๋ช
๋ น์ด๊ฐ ์ฑ๊ณตํ๋ฉด 0์ด ์๋ ๊ฐ์ ๋ฐํํ๋ฉฐ, ์คํจํ๋ฉด 0์ ๋ฐํํ๋ค.
- ๋ฐํ ๊ฐ: ๋ช
๋ น์ด์ ์ถ๋ ฅ์ ๋ํ๋ด๋ ๋ฌธ์์ด์ ๋ฐํํ๋ค. ์คํจํ ๊ฒฝ์ฐ false๋ฅผ ๋ฐํํ๋ค.
์๋ฅผ ๋ค์ด, ls ๋ช ๋ น์ด๋ฅผ ์คํํ์ฌ ํ์ฌ ๋๋ ํ ๋ฆฌ์ ํ์ผ ๋ชฉ๋ก์ ๊ฐ์ ธ์ค๋ PHP ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ ์ ์๋ค:
$output = system('ls', $return_var);
echo $output;
๋๋ ๋ช ๋ น์ด์ ์คํ ๊ฒฐ๊ณผ์ ์๊ด ์์ด ๋จ์ํ ๋ช ๋ น์ด๋ฅผ ์คํํ๊ณ ์ถ์ ๊ฒฝ์ฐ์๋ ๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฉํ ์ ์๋ค:
system('ls');
๋ค์ ๋์์์,
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";
์ด ๋ถ๋ถ์ ์์ธํ ๋ณด๋ฉด, ๋์๋ฌธ์ ๊ตฌ๋ณ์์ด ๋ฌธ์์ด์ "flag"๊ฐ ํฌํจ๋์ด ์์ผ๋ฉด "Error!"๊ฐ ์ถ๋ ฅ๋๋ค.
๊ทธ๋ ๋ค๋ฉด system() ํจ์๋ฅผ ์คํ์ํค๊ธฐ ์ํด์๋ "flag" ๊ฐ ํฌํจ๋์ด ์์ผ๋ฉด ์ ๋๋ค.
ํ์ง๋ง ํ๋๊ทธ๋ ../dream/flag.txt์ ์์นํ๋๋ฐ, ์ด๋ค ๋ฐฉ๋ฒ์ผ๋ก ํ๋๊ทธ ํ์ผ์ ์ ๊ทผํ ์ ์์๊น?
๋๋ '*' ๋ฌธ์๋ฅผ ์ฌ์ฉํ์ฌ ../dream ๋๋ ํ ๋ฆฌ ์์ ๋ชจ๋ ํ์ผ์ ๋ด์ฉ์ ์ถ๋ ฅ๋๊ฒ ํ ๊ฒ์ด๋ค.
ํ๋๊ทธ๋ฅผ ์ถ๋ ฅํ๊ฒ ๋์๋ค.
ํ์ด ์๋ฃ!
[2] ์ฐธ๊ณ ์๋ฃ
์ ๊ทํํ์:
http://www.ktword.co.kr/test/view/view.php?no=5720
์ด์ค์ผ์ดํ:
https://choseongho93.tistory.com/entry/PHP-%EB%AC%B8%EC%9E%90%EC%97%B4%EC%97%90-%EC%82%AC%EC%9A%A9%ED%95%A0-%EC%88%98-%EC%9E%88%EB%8A%94-%EC%9D%B4%EC%8A%A4%EC%BC%80%EC%9D%B4%ED%94%84-%EC%8B%9C%ED%80%80%EC%8A%A4
preg_match:
https://codingeverybody.kr/php-preg_match-%ED%95%A8%EC%88%98/
'SWLUG > CTF ๋ฌธ์ ํ์ด (2)' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Dreamhack/๋๋ฆผํต] pathtraversal (0) | 2024.05.15 |
---|---|
[Dreamhack/๋๋ฆผํต] baby-union (0) | 2024.05.08 |
[Dreamhack/๋๋ฆผํต] php7cmp4re (0) | 2024.04.28 |
[Dreamhack/๋๋ฆผํต] Carve Party (0) | 2024.04.01 |
[Dreamhack/๋๋ฆผํต] devtools-sources (0) | 2024.03.30 |