Dreamhack | Image Storage
Dreamhack Image Storage
본 문제는 Dreamhack을 통해서 풀어 보실 수 있습니다.
해답을 이해하며 생각을 해보면서 풀이 해보시길 바랍니다.
문제 내용
해당 커리큘럼은 File Vulnerability으로 파일을 업로드하거나 다운로드할 때 발생되는 취약점에 대해서 나옵니다.
문제 풀이
메인 페이지는 이미지를 업로드하고 이미지 파일을 공유해보라는 글만 존재한다.
일단 업로드가 가능하다는 것에서 웹 쉘을 업로드하여 플래그를 읽으면 될 것으로 예상된다.
UPLOAD PAGE
파일을 받아와 업로드가 가능하다. 현재는 확장자 jpg인 이미지 파일을 업로드하였을 때 ./uploads/ 경로에 업로드되는 것을 알 수 있다.
테스트용으로 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();
}
?>
소스 파일을 보면 이미 존재하는지만 검사하기에 쉽게 업로드가 가능하다.
LIST PAGE
URL은 list.php로 되어 있고 들어가면 우리가 업로드한 이미지 파일이 있다.
해당 소스를 확인해보면 디렉토리는 현재에서 uploads/ 이며, 해당 디렉토리를 조회할 때 .., ., index.html가 해당 하는 것은 제외하고 목록을 보여주는 것으로 되어있다.
<?php
$directory = './uploads/';
$scanned_directory = array_diff(scandir($directory), array('..', '.', 'index.html'));
foreach ($scanned_directory as $key => $value) {
echo "<li><a href='{$directory}{$value}'>".$value."</a></li><br/>";
}
?>
익스플로잇
Window Defender 때문에 코드를 올리지는 못한다. system($_GET['cmd']); 를 php 태그로 감싸고 업로드 이후 GET 메소드를 통해 명령어를 전달하면 아래처럼 웹 쉘이 제대로 적용된 것이다.
이와 같은 방식으로 /flag.txt를 불러오면 FLAG를 찾을 수 있을 것이다.