[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