SWUFORCE/워게임

phpreg 속 php코드 공부

S_SDY 2025. 11. 4. 21:14
<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