문제
풀이
처음 접속하면 웹의 구성은 아래와 같다.
메인 페이지이자 Home 페이지
List 페이지
Upload
Upload에서 올린 파일들은 List 에 이동하게 되고, exe 파일, dll 파일 등 다양하게 올라가 있는 것을 확인할 수 있다.
필자는 소스코드 부터 확인한다.
<?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>
여기서 확인해야하는 곳은 <?php ~ ?> 까지의 코드이다.
내부 코드를 확인하면, 확장자에 대한 제약이 존재하지 않는 것을 확인할 수 있다.
그렇다면 동일한 php 코드를 업로드하여 flag.txt 값을 출력하도록 코드를 작성한다.
필자가 작성한 코드는 아래와 같다. (see.php 로 변환 후, 업로드)
system 명령어를 사용하여 리눅스 명령어를 사용하는 것을 확인할 수 있다.
see.php 업로드 시 아래와 같이 php 업로드 위치를 보여준다.
/uploads/see.php에 접속하면 flag 값을 얻을 수 있다.
'Dreamhack > Dreamhack(1단계)' 카테고리의 다른 글
csrf-2 (웹 해킹) (0) | 2024.10.15 |
---|---|
xss-2 (웹 해킹) (0) | 2024.10.11 |
xss-1 (웹 해킹) (0) | 2024.10.08 |
simple_sqli (웹 해킹) (0) | 2024.10.08 |
php-1 (웹 해킹) (1) | 2024.08.28 |