[드림핵] php7cmp4re

SONG's 보안·2024년 4월 26일

드림핵

목록 보기
23/33

https://dreamhack.io/wargame/challenges/1113


서버를 생성 후 들어가보면 이런 화면이 뜬다.

한번 입력해보았다.

그러니 다시 해보라고 뜬다.

이것도 다시해보라고 뜨길래 코드를 뜯어보았다.

<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>

좀 이상한 코드 부분은 이것이다.

      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>";

input_1input_2를 입력받는데,
첫번째 조건 : $input_1과 $input_2가 모두 비어있지 않은지
두번째 조건 : input_1의 길이가 4보다 작아야한다.
세번째 조건 : input_1이 "8"보다 작고 "7.A"보다 작으며 "7.9"보다 큰지를 확인한다.
--> 7.A보다 작은 수가 무엇인지 모르겠고, 8보다 작고 7.9보다 큰 수는 7.9XX를 의미하는게 아닐까라는 생각..
네번째 조건 : input_2의 길이가 3보다 작고 1보다 큰지 본다.
다섯번째 조건 : input_2가 74보다 작고 "74"보다 큰지 확인한다.

이 조건이 되게 이상하다고 생각했다.
특히 7.A가 이상하다고 생각했다. 갑자기 문자가?
그래서 아스키코드가 아닐까? 라는 생각이 들어 변환해보았다.

input_1부터 해결해보자면

7.A --> 55 46 65

7.9 --> 55 46 57

즉, 55 46 57 < ? < 55 46 65 의 사이이면 되는 것이다.

7.:이 만족하는 것을 확인했다.

이제 input_2를 해결해보면

74 --> 55 52

즉, $(55 52) < ? < 74 의 사이의 숫자이면 되는 것이다.
그리고 길이가 2이여야 하기에 찾아보면

$(55 52) < 8

< --> 60

이것을 보고 숫자가 아닌 문자를 쓰면 되겠구나 싶었다.
문자 길이가 2여야 하기 때문에 << 로 해준다.

성공^^

아래는 실패한 것..

그러나 good try가 떴다.. 뭘까?
알고보니 조건을 잘못 생각했다.

profile
前) SWLUG 27기

0개의 댓글