[CTF] Dreamhack 문제 풀이: php reg

phpreg

목록

  1. PHP 정규화 표현식
  2. Code
  3. Payload
    1. Step1
    2. Step2
  4. 참고

1. PHP 정규화 표현식

정규 표현식(regular expression)은 문자열에서 특정한 규칙을 가지는 문자열의 집합을 찾아내기 위한 검색 패턴이다.

2. Code

step2.php

<?php
// POST request
if ($_SERVER["REQUEST_METHOD"] == "POST") {
  $input_name = $_POST["input1"] ? $_POST["input1"] : "";
  $input_pw = $_POST["input2"] ? $_POST["input2"] : "";

  // pw filtering: 영어 입력 X
  if (preg_match("/[a-zA-Z]/", $input_pw)) {
    echo "alphabet in the pw :(";
  }
  else{
    // 대소문자 구분 없이 "nyang"을 입력하면 빈문자열로 치환됨
    $name = preg_replace("/nyang/i", "", $input_name);
    // 정규표현 조건이 맞을 경우 "d4y0r50ng"로 치환함
    $pw = preg_replace("/\d*\@\d{2,3}(31)+[^0-8\"]\!/", "d4y0r50ng", $input_pw);
    
    // 이름이 "dnyang0310" 이고 비밀번호가 "d4y0r50ng+1+13"일 경우
    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 === "") {
      // 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: "flag"가 들어가면
      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";
}
?>

첫 번째로 namepw를 입력 받고 있다. name의 경우 대소문자 구분 없이 nyang이라는 글자가 들어가 있으면 빈 문자열로 치환하고 있다. pw의 경우 \d*\@\d{2,3}(31)+[^0-8\"]\! 조건식을 충족할 경우

  • \d*: 숫자(0-9) 0개 이상
  • \@: @ 1개
  • \d{2,3}: 숫자 2~3개
  • (31)+: 문자열 "31"이 1회 이상
  • [^0-8\"]: 0~8 숫자 또는 "를 제외한 1글자
  • \!: ! 1개

d4y0r50ng로 치환하고 있다.

두 번째로 cmd를 입력 받고 있다. cmd의 경우 대소문자 구분 없이 flag가 입력되어 있는 경우 에러 메시지를 띄운다.

3. Payload

3.1. Step1

500x261

id: dnnyangyang0310 nyang이 빈 문자열로 바뀌면서 앞 뒤 문자가 붙어서 dnyang0310.이 된다.

pw: @45319!+1+13 @45319!가 치환되어 d4y0r50ng로 바뀌고 그 뒤에 +1+13이 붙어 d4y0r50ng+1+13이 된다.

3.2. Step2

500x261

flag의 위치는 ../dream/flag.txt이고, flag를 전부 다 작성할 경우 에러 메시지가 뜨므로 특수 문자열 *를 사용해 우회할 수 있다.

cat ../dream/f*.txt

500x282


참고

Comments

Newest Posts