<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>
이 코드가 step2.php코드입니다!
아래 코드는 제가 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
//index.php에 보면 nickname이 input1, password가 input2임을 알 수 있습니다.
//input1의 값을 받아와서 input_name에 저장
//input2의 값을 받아와서 input_pw에 저장
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$input_name = $_POST["input1"] ? $_POST["input1"] : "";
$input_pw = $_POST["input2"] ? $_POST["input2"] : "";
// pw filtering
// 주석 내용처럼 비밀번호를 필터링하는 겁니다.
//preg_match는 두 번째 파라미터 속 문자열에서 첫번째 파라미터의 값이 있는지 확인하는 함수입니다.
//이때, 일치하는 값이 있으면 1(True)을 반환하고, 없으면 0을 반환합니다.
//1이면 if 하단의 명령문이 실행되고 아니면 else로 넘어갑니다.
if (preg_match("/[a-zA-Z]/", $input_pw)) {
echo "alphabet in the pw :(";
}
//여기서는 preg_replace로, 세 번째 파라미터로 받은 문자열에서 첫 번째 문자열이 발견된다면 두 번째 문자열로 교체하는 함수입니다.
//이때, /nyang/i에서 'i'는 대소문자의 구분을 없애주는 역할을 합니다.
// \d*\@\d{2,3}(31)+[^0-8\"]\! 이 무섭게 생긴 애는 코드 밖 표로 정리해보겠습니다. 여기서 하기엔 무립니다.
else{
$name = preg_replace("/nyang/i", "", $input_name);
$pw = preg_replace("/\d*\@\d{2,3}(31)+[^0-8\"]\!/", "d4y0r50ng", $input_pw);
//여튼 위와 같은 과정을 거치고, 아이디와 비밀번호가 원하는 값인지 확인하는 절차를 거칩니다.
//이때 아이디는 dnyang0310이어야하고, 비밀번호는 d4y0r50ng+1+13이어야합니다.
//그리고 맞다면, if문이 실행되면서 step2로 넘어가게됩니다.
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
//이제 cmd를 통해 flag를 얻어야하는데요,
//preg_match함수를 사용해서 flag라는 단어를 못쓰게 막아놨어요^^
else if (preg_match("/flag/i", $cmd)) {
echo "<pre>Error!</pre>";
}
//그리고 flag라는 단어가 없으면 cmd를 system을 사용해서 출력하네요.
//(아, 여기서 system함수를 쓰네요. 전 제가 쓰는 줄 알았어요... ^^)
else{
echo "<pre>--Output--\n";
system($cmd);
echo "</pre>";
}
}
//이 else는 저 위에서 step2로 가기위한 아이디와 비밀번호를 입력할 때 사용했던 if에 대한 else입니다. 즉, 아이디와 비밀번호가 틀렸을 때 아래를 출력하는 겁니다.
else{
echo "Wrong nickname or pw";
}
}
}
// GET request
//이 else는 값을 서버로부터 받지 못했을 때 실행되는 것 같습니다.
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>
| 정규식 표현 | 요구 조건 |
| \d* | 숫자가 없거나, 하나 이상 들어가야 됨 |
| \@ | @기호가 꼭 있어야 됨 |
| \d{2,3} | 숫자가 정확히 2개 or 3개 와야 됨 |
| (31)+ | 31이라는 문자열이 최소 1번 이상 반복되어야 됨 |
| [^0-8"] | 0~8 & 큰따옴표를 제외한 아무 문자 1개가 오면 됨 |
| \! | !가 반드시 와야 됨 |
위에서 step2로 넘어가는 구간에 나오는 규칙을 풀어서 써놓은 표입니다. 위의 표는 위에서부터 순서대로 만족하는 비밀번호를 만드셔야 됩니다.
'SWUFORCE > 워게임' 카테고리의 다른 글
| game2 (0) | 2025.11.18 |
|---|---|
| [추가 공부]VBS 기초 문법 공부 (0) | 2025.11.11 |
| Game 01 (0) | 2025.11.11 |
| [Web] phpreg (0) | 2025.11.04 |
| [추가 공부]session & cookie (0) | 2025.10.27 |