본문 바로가기

SWLUG/CTF

[CTF/Dreamhack] phpreg

 

phpreg

Description php로 작성된 페이지입니다. 알맞은 Nickname과 Password를 입력하면 Step 2로 넘어갈 수 있습니다. Step 2에서 system() 함수를 이용하여 플래그를 획득하세요. 플래그는 ../dream/flag.txt에 위치합니

dreamhack.io

 

 

phpreg 

 

문제 설명

 

 

- Nickname과 Password 찾기

-  system() 함수 이용

- ../dream/flag.txt 파일에 플래그 위치

 

 

 

문제 분석

 

서버에 접속하면 아래와 같은 step1, step2 화면을 볼 수 있다.

step1
step2

 

 

우선 개발자도구에는 쓸모있는 게 없는 것 같아서 ... 바로 다운로드 받은 파일을 열어 확인해준다.

 

index 말고 step2.php 파일을 먼저 열어 확인해본 결과...! 중요할 것 같은 코드를 가져와봤다.

 

// pw filtering
            if (preg_match("/[a-zA-Z]/", $input_pw)) {
              echo "alphabet in the pw :(";
            }
            else{
              $name = preg_replace("/nyang/i", "", $input_name);
              $pw = preg_replace("/\d*\@\d{2,3}(31)+[^0-8\"]\!/", "d4y0r50ng", $input_pw);
              
              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 === "") {
                  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
                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";
              }
            }
          }

 

 

이 코드를 그대로 적용해보았으나,  아래와 같은 오류 화면이 출력되면서 다음 단계로 넘어갈 수 없었다.

 

 

 

코드를 다시 잘 확인해보니 비밀번호에 필터링이 적용되어 있는 것을 확인할 수 있었다.

 

첫 번째 필터링을 확인해보도록 하자.

a-z까지 대소문자 포함하여 알파벳이 포함되어있을 경우, "alpabet in the pw :(" 라고 출력된다.

 

 

 

두 번째 필터링을 확인해보도록 하자.

preg_replace()
지정된 패턴을 찾아서 다른 패턴으로 바꿔주는 함수.

 

 

preg_replace() 함수를 이용하여 input_name에서 "nyang" 문자열을 공백으로 바꿔주고 있다.

input_pw에서 "/\d*\@\d{2,3}(31)+[^0-8\"]\!/" 문자열을 "d4y0r50ng" 로 바꿔주고 있다.

 

**
i가 붙는 경우는 대소문자를 구분하지 않는다는 뜻
**

 

그렇다면 name 필터링을 우회하기 위해서는 " dnynyangang0310 "을 입력하면 될 것 같다.

pw 필터링을 우회하는 건 더 복잡한 듯 하니 천천히 알아보도록 하자.

 

 

 

 

비밀번호는 d4y0r50ng+1+13" 이어야 하는데,  "/\d*\@\d{2,3}(31)+[^0-8\"]\!/" "d4y0r50ng" 을 의미하므로 이를 분석해보도록 하겠다.

 

\d* : 0~9 사이의 수 0번 이상 반복 ( '\d' : 0에서 9까지의 범위의 한 자리 숫자, '*' : 문자 또는 숫자가 0개 이상)
\@ : 문자 @
\d{2,3} : 0~9 사이의 수 2~3번 반복 ( '\d'  : 0에서 9까지의 범위의 한 자리 숫자 , '{2,3}' : 앞에 작성한 표현을 2~3회 반복)
(31) : 숫자 31
[^0-8] : 0 - 8이 아닌 숫자
\! : 문자 !

 

모든 조건에 부합하는 값 1@12319! 에  나머지 +1+13을 합하여 "1@12319!+1+13"을 입력한다.

 

 

 

 

다음 단계 step2로 넘어간 것을 확인할 수 있다.

 

 

우선 코드를 확인해보면 이와 같은데...

preg_match('/대조 할 문자/','입력한 문자', $matches); 
주어진 정규 표현식 패턴을 사용하여 문자열 내에서 일치(match)하는 부분을 찾아내는 함수

**
i가 붙는 경우는 대소문자를 구분하지 않는다는 뜻
**
system() 
php에서 운영체제 명령어를 실행시킬 수 있는 함수

 

 

이제 문제에서 주어진 힌트를 적용하여 해결하면 될 듯 하다.system() 함수를 보니 cmd를 flag로 필터링하고 있다. cmd 명령어를 활용하여 플래그를 찾아면 될 것 같다...

 

문제에서 플래그는 ../dream/flag.txt에 위치하고 있다 하였으므로, cmd 창에서 문서를 검색하는 명령어인 'cat'을 이용하고 flag에 대한 필터링을 우회하기 위해 'cat ../dream/f?ag.txt' 를 입력하였다. 

 
 

플래그 획득!

 

 

 

 

번외로.... more을 이용해서 풀어보았는데 똑같이 플래그를 획득할 수 있었다. ls -al을 통해 풀면 아래와 같이 파일 정보만 확인할 수 있었다.

 

 

 

'SWLUG > CTF' 카테고리의 다른 글

[CTF/Dreamhack] pathtraversal  (0) 2024.05.11
[CTF/Dreamhack] baby-union  (0) 2024.05.06
[CTF/Dreamhack] php7cm4re & Flying Chars  (0) 2024.04.27
[CTF/Dreamhack] devtools-sources & Carve Party  (1) 2024.04.27
[CTF/Dreamhack] cookie & session  (2) 2024.04.27