우선 해당 문제에 접속하면 아래와 같은 문제 설명을 볼 수 있다.
파일 업로드 취약점을 활용하여 해결할 수 있는 문제인 것 같다.
접속 정보를 확인하여 문제 페이지에 접속해보니 아래 페이지를 확인할 수 있었다,
위 카테고리 중 Home 버튼을 눌렀을 때에는 첫 메인 화면과 같은 화면이 나오고 List 버튼을 눌렀더니 빈 화면으로 되어있었다. 아마 아직은 작성한 것이 없어 리스트 페이지에도 아무것도 안뜨는 것 같다.
마지막 카테고리인 Upload를 클릭하여 들어가보니 아래와 같은 페이지로 구성되어 있었다.
파일을 업로드할 수 있는 페이지가 있으므로 우선 아무런 이미지를 올려보자.
나는 포렌식 프로젝트에서 활용했던 고양이 사진을 가져왔다
고양이 이미지 파일을 넣고 업로드를 하니
다음과 같은 문구를 볼 수 있었고, 이는 'cat.jpeg' 파일이 아래와 같은 경로에 저장되었음을 알 수 있었고, 파일 경로도 함께 노출되어 있었다.
파일을 업로드 하였으니 다시 list 카테고리로 돌아가여 파일이 업로드 되었는지 확인해본 결과, 아래와 같이 이미지가 업로드 된 것을 볼 수 있었고, 파일명을 클릭하니 업로드한 이미지를 볼 수 있었다.
Upload 카테고리에서 따로 파일을 올리지 않고 바로 Upload 버튼을 눌러보니 아래 화면과 같이 에러가 뜬 것을 볼 수 있다. 이제 문제 페이지에서 더 이상 알 수 있는 것은 없어보이므로 문제 코드로 넘어가서 문제를 풀어보자.
문제 파일 중 총 3가지 파일이 있었는데 해당 문제는 파일 업로드 취약점과 관련된 문제이니 '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();
}
?>
역시나 upload.php 코드에는 업로드 한 파일에 대해 필터링을 진행하는 코드가 없었다.
별도의 필터링이 없다는 취약점을 활용하여 문제를 풀어보자
문제 설명에서 플래그는 /flag.txt 에 있다고 하였으니 해당 파일에서 플래그를 출력하기 위해 cat 명령어를 사용하였고, 해당 명령어를 php 파일에서 사용하기 위해 system 함수를 활용하여 'flag.php' 파일을 하나 만들어주었다.
cat 명령어
리눅스(Linux)에서 파일의 내용을 간단하게 출력하거나, cat명령어 이름처럼 두 개 이상의 파일을 연결(concatenate)해서 출력할 때 사용하는 명령어
system 함수
php 소스코드에서 리눅스 특정 명령어를 실행하기 위해 사용하는 함수
이렇게 만든 파일을 업로드 하니
동일하게 리스트 카테고리에서 확인할 수 있었다.
여기서 flag.php에 들어가보니 아래와 같이 파일의 플래그가 출력되는 것을 볼 수 있었다.
문제 해결!!
'CTF' 카테고리의 다른 글
[RootMe] Install files (0) | 2023.10.01 |
---|---|
[Webhacking.kr] old-28 write-up (0) | 2023.10.01 |
[Webhacking.kr] old-12 write-up (0) | 2023.09.24 |
[RootMe] Javascript - Webpack (0) | 2023.09.23 |
[RootMe] Javascript - Authentication 2 (0) | 2023.09.23 |