서버 생성 / 문제 파일 받기
페이지를 살펴보면 Upload 항목에 파일을 업로드할 수 있습니다 여기에 드림핵 이미지를 업로드하면 이미지가 업로드된 위치를 반환합니다 이 위치에 방문하면 우리가 업로드한 드림핵 이미지를 확인할 수 있습니다
앞서 배운 파일 업로드 취약점을 이용하여 WebShell을 업로드해 flag 값을 찾아봅시다
<?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>
WebShell을 업로드하기 전에 소스코드를 살펴봅시다 문제 파일을 다운받으시면 index.php, list.php, upload.php 소스 파일이 들어있는 걸 알 수 있는데 WebShell 실행 전제 조건 중 서버 사이드 언어에 맞게 작성해야 합니다
upload.php 코드 내부를 살펴봤을 때 WebShell을 필터링하는 과정이 없어 php로 작성된 WebShell을 업로드해 봅시다
전 간단하게 system 함수를 이용해서 GET 요청에서 musa 매개변수에 명령어를 입력할 수 있는 test.php라는 WebShell을 만들었습니다
즉 이 파일이 업로드된 경로 URL 파라미터에 musa 매개변수를 사용하여 시스템 명령어를 작동시킬 수 있습니다
제작한 WebShell을 업로드하고 파일이 업로드된 경로로 방문하면 빈 페이지가 보이게 됩니다 왜 빈 페이지냐면 앞서 제작한 WebShell은 musa라는 매개변수를 이용해서 시스템 명령어를 작동시킬 수 있습니다 하지만 현재 아무런 매개변수를 설정하지 않았기 때문에 빈 페이지로 보이는 겁니다
즉 ? 쿼리 스트링 뒤에 musa 매개변수에 리눅스 시스템 명령어 ls를 입력하게 되면 현재 경로에 있는 파일들을 보여줍니다
정상적으로 test.php 파일이 업로드되어 작동되고 있는 걸 알 수 있습니다
flag 값은 문제에서 /flag.txt에 있다고 했으니 cat 명령어를 이용해서 flag 값을 읽어올 수 있습니다
단순하게 WebShell에서 System("cat /flag.txt");로 작성해도 위에 결과와 동일하게 작동됩니다
[ 선수 학습 내용 ]