해킹/Web hacking
Pearfect Markdown (dreamhack) write up
공부하는 뚱이
2025. 3. 4. 20:27
반응형
VM에 접속하면 이렇게 생긴 화면이 나온다.
코드를 다운로드 받아서 코드를 살펴보자.
index.php 파일
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Markdown Editor</title>
<link rel="stylesheet" href="css/styles.css">
</head>
<body>
<div class="container">
<h1>Upload and Edit Markdown Files</h1>
<form action="upload.php" method="post" enctype="multipart/form-data">
<label for="file">Choose Markdown file:</label>
<input type="file" name="file" id="file" accept=".md">
<input type="submit" value="Upload">
</form>
<div class="preview-container">
<h2>Example Markdown Preview</h2>
<div class="markdown-preview" id="preview"></div>
</div>
<?php
$uploads_dir = 'uploads/';
if ($handle = opendir($uploads_dir)) {
echo "<h2>Uploaded Files</h2><ul>";
while (false !== ($entry = readdir($handle))) {
if ($entry != "." && $entry != "..") {
echo "<li><a href='edit.php?file=" . urlencode($entry) . "'>" . htmlspecialchars($entry) . "</a></li>";
}
}
closedir($handle);
echo "</ul>";
}
?>
</div>
<script>
fetch('post_handler.php')
.then(response => response.text())
.then(data => {
document.getElementById('preview').innerHTML = marked.parse(data);
});
</script>
</body>
</html>
사용자가 .md 파일을 업로드 할 수 있도록 해줌
uploads/ 디렉터리 내 파일을 목록으로 표시하고
Markdown 미리보기 기능을 제공한다. 그렇기 때문에 첫 페이지에서 Example Markdown Preview를 볼 수 있는 것이었다.
취약점
<?php
$uploads_dir = 'uploads/';
if ($_SERVER['REQUEST_METHOD'] === 'GET') {
$file = $_GET['file'] ?? 'example.md';
$path = $uploads_dir . $file;
include($path);
} else {
echo "Use GET method!!";
}
?>
이 문제의 취약점은 바로 post_handler.php에 있었다.
PHP 코드에서 다른 PHP 파일을 포함할 때 사용하는 include($path);를 사용하여 .md 파일은 원래 PHP 코드가 포함되지 않은 문서 파일이어야 하지만, .md 파일 안의 PHP 코드가 그대로 실행되게 된다.
그렇기 때문에 .md 파일 안에 <?php system("ls -al"); ?> 과 같은 PHP 코드가 포함되어 있으면 실행되게 되는 것이다.
익스플로잇
우리의 목적은 flag.txt 파일을 읽는 것이다. 읽는 것은 cat!!! flag 파일은 루트 디랙토리에 위치해 있다. 따라서
cat /*flag 명령어는 리눅스 시스템에서 특정 파일의 내용을 출력하려는 시도이다.
예를 들어, /flag.txt, /flag123, /flag_secret 같은 파일이 있다면 cat /*flag는 해당 파일들의 내용을 출력하려고 명령하는 것이다.
컷!!!
반응형