본문 바로가기

Dreamhack/웹해킹

[🌱Beginner] php7cmp4re

문제 설명

php 7.4로 작성된 페이지입니다.

알맞은 Input 값을 입력하고 플래그를 획득하세요.

플래그 형식은 DH{} 입니다.

 

웹 서비스에 접속하면 input1과 input2 를 입력하는 화면이 나타납니다.

 

임의의 값을 입력해보았으나 결과 화면에는 단순히 Try again 문구만 출력되는 것을 확인할 수 있었습니다.

 

정확한 동작 원리를 확인하기 위해, 직접 소스 코드를 먼저 살펴보았습니다.

 

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>

 

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"){

조건을 하나씩 확인해본 결과,

Input 1의 경우 먼저 입력값이 존재해야 하며 그 길이가 반드시 4 미만이어야 합니다. 또한 단순히 길이만 만족하는 것이 아니라, 입력된 값 자체가 문자열 "8"과 "7.A"보다 작으면서 동시에 "7.9" 이상이어야 한다는 비교 조건이 걸려 있음을 알 수 있습니다. 즉, 문자열 비교를 통해 매우 제한적인 범위 내의 값만 허용되도록 설정되어 있는 구조입니다.

Input 2는 입력값의 길이가 1보다 크고 3보다 작은 조건을 가져야 하므로 사실상 길이가 정확히 2여야만 합니다. 여기에 추가적으로 값 자체가 문자열 "74"보다 크면서 동시에 정수 74보다 작은 범위여야 하는 조건입니다.

 

따라서 이 문제는 단순한 숫자나 문자열 입력으로 해결할 수 있는 것이 아니라, 아스키코드 값의 미세한 차이를 고려해야 풀 수 있는 문제라는 것을 확인할 수 있었습니다. 아래는 분석을 위해 활용할 아스키 코드 표입니다.

 

아스키 코드 표를 참고하여 조건을 다시 살펴보면, Input 1은 문자열 "7.A"와 "7.9" 사이에 위치해야 합니다. 문자열 비교의 특성상 앞의 "7." 부분은 동일하므로 실제 비교는 뒤에 오는 문자(A와 9)에서 갈리게 됩니다.

  • "A"의 아스키 값은 65이고,
  • "9"의 아스키 값은 57이므로,

이 조건을 만족하기 위해서는 "A"보다 작고 "9"보다 큰 아스키 값을 가진 문자가 필요합니다. 즉, 숫자와 알파벳 사이에 위치한 특수 문자 중 하나를 선택하면 조건을 충족할 수 있습니다.

따라서 Input 17.?와 같은 형태로 입력하면 조건을 만족시킬 수 있습니다.

 

Input 2의 경우 조건은 문자열 "74"보다 크고, 동시에 정수 74보다 작아야 한다는 것입니다. 이를 아스키코드 표를 통해 확인해보면:

  • "7"은 아스키 값 55, "4"는 52로 이루어진 문자열 "74"가 기준점이 됩니다.
  • 문자열 비교에서는 "74"보다 크면서도, 숫자로 변환했을 때는 정수 74보다 작은 값을 만족해야 합니다.

따라서 단순한 숫자로는 충족이 불가능하고, "74"라는 문자열보다 크다고 판별되는 특수문자 조합이 필요합니다. 그 범위 안에서 두 자리 길이를 만족하는 문자를 선택하면 조건을 충족할 수 있습니다.

즉, Input 2??와 같은 형태로 입력했을 때 문제에서 요구하는 조건을 만족하게 됩니다.

 

결론적으로, 이 문제를 풀기 위한 입력값은 다음과 같습니다.

Input1: 7.?
Input2: ??

아스키코드 기반으로 조건을 해석하고 적절한 입력값을 넣어본 결과, 드디어 풀이에 성공했습니다.

'Dreamhack > 웹해킹' 카테고리의 다른 글

[LEVEL 1] proxy-1  (1) 2025.08.31
[LEVEL 1] Disgusting Ads  (0) 2025.08.28
[🌱Beginner] phpreg  (0) 2025.08.27
[🌱Beginner] Flying Chars  (0) 2025.08.25
[🌱Beginner] ex-reg-ex  (0) 2025.08.22