Dreamhack

[Dreamhack] phpreq Write-Up

jeff_kim 2024. 3. 15. 14:30

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

 

phpreg

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

dreamhack.io

 

문제

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

 

 

풀이

 

1.  서버를 생성한 후에 웹해킹 링크로 들어간다.

 

 

2. 문제 파일을 받아 index.php 와 step2.php 를 확인한다. index.php를 보면 크게 얻어갈 단서는 없는 듯 하고 step2.php에서 본격적인 단서 들이 나온다

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

            // 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>';

 

유심히 봐야할 코드만 추려서 올렸다.

 

  • 단서1 : pw filtering이 걸려있다 "/[a-zA-z]/" 알파벳을 pw로 적을 시 alphabet in the pw :( 라는 문구가 떨어진다

  • 단서2 : prge_replace 로 인해 "/nyang/i" "" nyang 이라는 문자열이 인식이 되면 빈 공백으로 replace 되는 코드가 보인다 
  • 단서3 : 정규 표현식 ("/\d*\@\d{2,3}(31)+[^0-8\"]\!/"을 입력하게 되면 -> "d4y0r50ng" 이런 문자열로 replace되는 점
  • 단서4 : name은 dnyang0310 이 되어야하고 pw는d4y0r50ng+1+13 이런 형식으로 되어야 step2로 넘어갈 수 있다

 

이 단서들을 활용하여 문제를 풀면된다 단서4 에서 d4y0r50ng+1+13 이것은 큰 따옴표에 묵여있기 때문에 113 이 아니라 "+1+13" 그대로 입력을 해야한다.

 

 

 

 

3. 단서를 이용해서 해석한 후에 문제를 풀어보자

  • 우선 name에 대한 부분이다
    • /i => 대소문자를 무시하는 플래그 
    • nyang를 입력하면 공백("")으로 인식하니  출력이 정답에 맞게 적어주면 된다 
    • dnyangnyang0310 -> replace 되면 d0310 이 된다
    • dnynyangyang0310 -> replace 되면 dnyang0310 정답이다!
  • pw 정규 표현식 해석
    • \d* => 0개 이상의 숫자
    • \@ => @
    • \d{2,3}(31) => 2~3자리 숫자 후에 31이 오면 된다
    • +[^0-8\"] => ^표시는 뒤에 주어진 값을 제외하고 라는 뜻이므로 0~8 그리고 " 를 제외한 나머지 문자
    • \! => 마지막은 !로 나와야한다
    • 이렇게 정규식에 맞게 적는다면 보이진 않지만 d4y0r50ng 로 replace 될것이고 마지막으로 뒤에 +1+13을 적어주면 된다
    • 123@31319!+1+13
    • 123@54319!+1+13
    • 여러 가지로 pw를 테스트 해보았다. 

4. step2 

step2에서는 flag를 찾으면 된다 step2.php 코드를 보면 cmd filtering도 되어있다.

// cmd filtering
                else if (preg_match("/flag/i", $cmd)) {
                  echo "<pre>Error!</pre>";
                }
                else{
                  echo "<pre>--Output--\n";
                  system($cmd);
                  echo "</pre>";
                }

 

cmd filtering은 flag 라는 문자를 대소문자 구분 없이 사용한다면 Error! 라는 출력 값을 우리에게 선사한다

하지만 이미 문제에서 flag 경로를 우리에게 알려주었다

 ../dream/flag.txt 이 경로에 있다고 한다.

cat ../dream/f?ag.txt 또는 cat ../dream/*.txt  를 사용하여 직접적인 flag를 적지 않고도 다양한 방법으로 flag를 획득할 수 있다

 

 

 

 

 

 

 


DH{ad866c64dabaf30136e22d3de2980d24c4da617b9d706f81d10a1bc97d0ab6f6}

 

 

flag 획득!!

 

'Dreamhack' 카테고리의 다른 글

[Dreamhack] session-basic Write-Up  (0) 2024.03.16
[Dreamhack] cookie Write-Up  (1) 2024.03.16
[Dreamhack] ex-req-ex Write-Up  (2) 2024.03.15
[Dreamhack] blue-whale Write-Up  (3) 2024.03.15
[Dreamhack] baby-linux Write-Up  (1) 2024.03.14