웹 애플리케이션에서 파일 다운로드 기능은 사용자가 서버에서 저장된 파일을 다운로드할 수 있도록 허용하는 기능입니다. 사용자가 파일을 다운로드할 때, 웹 애플리케이션은 요청된 파일의 경로를 적절히 검증하고, 안전한 파일만 제공해야 합니다. 하지만 파일 경로 검증이 제대로 이루어지지 않거나 파일 이름에 대한 검증이 부족할 경우, 공격자는 악성 파일을 다운로드하거나 시스템 파일에 접근할 수 있게 됩니다.
예시 1: 경로 탐색(Path Traversal) 공격을 이용한 파일 다운로드
$file = $_GET['file']; // 사용자가 요청한 파일 경로
$path = "/var/www/html/uploads/" . $file; // 파일 경로 설정
- 사용자는 http://example.com/download?file=example.txt와 같은 URL을 통해 example.txt 파일을 다운로드하려고 할 수 있습니다.
- 공격자는 file=../../../../etc/passwd와 같이 경로를 조작하여, 서버의 중요한 시스템 파일인 /etc/passwd 파일을 다운로드할 수 있게 됩니다. 예를 들어 : http://example.com/download?file=../../../../ect/passwd
- ../../../../etc/passwd는 Path Traversal 공격을 이용해 /etc/passwd 파일에 접근하는 경로입니다. 이 파일은 리눅스 시스템에서 사용자 계정 정보와 암호화된 비밀번호를 저장하는 파일로, 공격자는 이를 통해 인증 우회나 시스템 정보 탈취를 시도할 수 있습니다.
방어 방법
- 파일 경로 검증을 철저히 하여 상위 디렉터리로 이동하는 ../ 문자를 포함한 경로를 차단합니다.
- 경로를 정규화하여 절대 경로를 확인하고, 허용된 디렉터리 내에서만 파일 다운로드가 이루어지도록 해야 합니다.
예시 2: 악성 파일 다운로드(사용자 입장)
- 파일 업로드: 공격자는 PHP 웹 쉘을 웹 애플리케이션에 업로드합니다. 웹 애플리케이션에서 사용자는 파일 업로드를 통해 PHP 파일을 업로드할 수 있으며, 이 파일이 웹 서버의 실행 가능한 디렉터리에 저장됩니다.
- 파일 다운로드: 공격자는 http://example.com/uploads/shell.php와 같은 URL을 통해 PHP 웹 쉘 파일을 다운로드할 수 있습니다.
- 명령어 실행: 다운로드한 shell.php 파일을 실행하게 되면, 공격자는 cmd 파라미터를 통해 서버에서 명령어를 실행할 수 있습니다. 예를 들어: http://example.com/uploads/shell.php?cmd=ls이 URL을 호출하면 서버에서 명령어(예: ls)가 실행되어, 서버의 파일 목록이 공격자에게 표시됩니다.
방어 방법
- 파일 확장자 및 MIME 타입 검증을 통해 PHP, JSP, ASP와 같은 실행 가능한 파일의 업로드를 차단해야 합니다.
- 실행 권한을 부여하지 않고, 읽기/쓰기 권한만 부여하여 악성 파일이 서버에서 실행되지 않도록 설정합니다.
'Dreamhack > 웹해킹' 카테고리의 다른 글
| (드림핵) Carve Party (0) | 2025.04.01 |
|---|---|
| (드림핵) SSRF (0) | 2025.04.01 |
| File Upload Vulnerability (0) | 2025.03.24 |
| (드림핵) File-download-1 (0) | 2025.03.24 |
| (드림핵) Image-Storage (0) | 2025.03.24 |