[CTF] Season 5 Round #2

바울·2024년 5월 6일
0

php 7.4로 작성된 페이지입니다.
알맞은 Input 값을 입력하고 플래그를 획득하세요.
플래그 형식은 DH{} 입니다.

문제 사이트

코드 분석

index.php

<html>
<head>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css">
<title>php7cmp4re</title>
</head>
<body>
    <!-- Fixed navbar -->
    <nav class="navbar navbar-default navbar-fixed-stop">
      <div class="container">
        <div class="navbar-header">
          <a class="navbar-brand" href="/">php7cmp4re</a>
        </div>
        <div id="navbar">
          <ul class="nav navbar-nav">
            <li><a href="/">index page</a></li>
          </ul>
        </div><!--/.nav-collapse -->
      </div>
    </nav>
    <div class="container">
      <div class="box">
      <h4>Enter the correct Input.</h4>
        <p>
          <form method="post" action="/check.php">
              <input type="text" placeholder="input1" name="input1">
              <input type="text" placeholder="input2" name="input2">
              <input type="submit" value="제출">
          </form>
        </p>
      </div>

    <?php
        require_once('flag.php');
        error_reporting(0);
    ?> 
    </div> 
</body>
</html>

flag.php

<?php
    $flag = 'flag{**Sample**}'
?> 

check.php

<html>
<head>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css">
<title>php7cmp4re</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="/">php7cmp4re</a>
        </div>
        <div id="navbar">
          <ul class="nav navbar-nav">
            <li><a href="/">Index page</a></li>
          </ul>
        </div><!--/.nav-collapse -->
      </div>
    </nav>
    <div class="container">
    <?php
    require_once('flag.php');
    error_reporting(0);
    // POST request
    if ($_SERVER["REQUEST_METHOD"] == "POST") {
      $input_1 = $_POST["input1"] ? $_POST["input1"] : "";
      $input_2 = $_POST["input2"] ? $_POST["input2"] : "";
      sleep(1);

      if($input_1 != "" && $input_2 != ""){
        if(strlen($input_1) < 4){
          if($input_1 < "8" && $input_1 < "7.A" && $input_1 > "7.9"){
            if(strlen($input_2) < 3 && strlen($input_2) > 1){
              if($input_2 < 74 && $input_2 > "74"){
                echo "</br></br></br><pre>FLAG\n";
                echo $flag;
                echo "</pre>";
              } else echo "<br><br><br><h4>Good try.</h4>";
            } else echo "<br><br><br><h4>Good try.</h4><br>";
          } else echo "<br><br><br><h4>Try again.</h4><br>";
        } else echo "<br><br><br><h4>Try again.</h4><br>";
      } else{
        echo '<br><br><br><h4>Fill the input box.</h4>';
      }
    } else echo "<br><br><br><h3>WHat??!</h3>";
    ?> 
    </div> 
</body>
</html>

check.php 파일에 input칸에 대한 조건문이 있어서 해석해 보았다.

1) input_1과 input_2는 공백이여서는 안 된다.
2) input_1의 문자열 길이는 4 미만이어야 한다.
3) input_1은 문자열 값 "8" 보다 작고 "7.A"보다 작으며 동시에 "7.9"보다 커야 한다.
4) input_2는 문자열 길이는 3 미만, 1 초과이어야 하고(3 > input_2 > 1),
결과값은 숫자 74 > input_2, 문자열 "74" < input_2 이어야 한다.

비슷한 값을 넣어보았다.

아무리 대입을 해봐도 답이 안나와서 생각해보다가 아스키코드를 확인해 보았다.

input1 조건이 7.A보다 작고 7.9보다 커야하기에 표를 확인해 보면 9와 A사이에 기호들이 있는 걸 볼 수 있어서 7.: 7.; 7.= 등등 사이에 있는 기호를 넣어 답을 입력해 보았다.

input1은 맞는 답인거 같다. input2의 조건은 이해가 되지않아 찾아 본 결과

PHP에서는 문자열을 숫자로 변환활 때, 가능한 가장 긴 숫자를 찾는다.
즉, 숫자가 아닌 문자를 만날 때까지 문자열을 숫자로 변환한다.

위에 정보를 토대로 값을 입력해 보면

플래그를 획득할 수 있다!

0개의 댓글