이번 실습은 DVWA 환경에서 File Upload 취약점을 활용하여 파일 검증이 부족한 상황에서 악성 파일을 업로드하는 위험성을 다뤘다. 실습은 Low 보안 단계에서 진행했으며, 업로드 기능이 어떻게 악용될 수 있는지를 확인해 보는 것이 목표였다.
1. File Upload 공격이란?
파일 업로드 취약점 (File Upload Vulnerability)은 공격자가 웹 서버에 악성 스크립트(.php, .jsp 등)를 업로드 한 뒤 실행하여 서버를 제어하거나 내부 정보를 탈취하는 공격이다.
업로드된 악성 파일은 웹 서버에서 곧바로 실행될 수 있고, 이를 통해 웹쉘 업로드, 리버스 쉘 획득, 추가 공격 확장이 가능하다.
=> 특히 File Inclusion(파일 포함) 취약점과 함께 사용될 경우, 단순 이미지나 .php .txt 파일도 실행될 수 있어 매우 위험한 조합이 된다.
2. 환경 설정 및 오류 해결
DVWA의 File Upload 기능 사용 시 아래와 같은 오류가 발생했다.
The PHP module GD is not installed.
GD는 PHP의 이미지 처리 라이브러리로, 이미지 업로드 시 getimagesize() 등의 함수가 필요할 경우 필요하다.
해결 방법
apt install php8.2-gd
systemctl restart apache2
업로드 파일 크기 제한 해제
기본적으로 PHP는 업로드 가능한 최대 파일 크기와 POST 방식 최대 전송 크기를 제한한다.
이를 완화하기 위해 다음 설정을 수정하였다.
# /etc/php/8.2/apache2/php.ini
upload_max_filesize = 10M
post_max_size = 10M
적용 후 반드시 웹 서버 재시작
systemctl restart apache2
3. 공격 개요
파일 업로드 기능이 있는 웹 애플리케이션에서 적절한 파일 확장자, MIME 타입, 콘텐츠 검증 없이 사용자가 올리는 파일을 서버에 저장하면, 공격자는 악성 스크립트(PHP 등)를 실행시켜 원격 코드 실행 또는 웹 쉘 획득 등으로 이어질 수 있다.
4. 취약한 PHP 업로드 코드 분석
<?php
if (isset($_POST['Upload'])) {
$target_path = DVWA_WEB_PAGE_TO_ROOT . "hackable/uploads/";
$target_path .= basename($_FILES['uploaded']['name']);
if (!move_uploaded_file($_FILES['uploaded']['tmp_name'], $target_path)) {
echo '<pre>Your image was not uploaded.</pre>';
} else {
echo "<pre>{$target_path} succesfully uploaded!</pre>";
}
}
?>
소스코드 취약점
- 파일명을 그대로 사용함 => Directory Traversal(공격자가 서버에서 임의의 파일을 읽을 수 있음) 우회 가능성 존재
- 확장자 제한 없음 => .php , .phtml, .php5 등 업로드 가능
- MIME 타입 필터링 없음
- 실행 디렉터리에 저장(/hackable/uploads/) => 즉시 접근 가능
5. 악성 파일 업로드 시도
초기에는 .php 확장자 업로드를 시도해 보았는데, 시스템에서 ini 파일이 보이지 않는 문제가 있었고, 이에 따라 텍스트 파일로 위장한 코드 파일을 사용하였다
cp shell.php shell.txt
=> shell.txt로 업로드한 뒤, 서버에서 확장자 변경 후 실행하거나, .txt 안에 PHP 코드가 들어 있더라도 웹 서버에서 PHP로 처리될 경우 공격이 가능하다.
6. 이미지 위장 업로드 & File Inclusion 연계
단순한 업로드만으로 끝나지 않고, File Inclusion 취약점과 연계하여 이미지나 악성 파일을 include() 시도할 수도 있다.
테스트용 dog.png 업로드
- dog.png 라는 정상적인 이미지 파일을 업로드
- 업로드 성공 시 경로 : /hackable/uploads/dog.png
File Inclusion으로 우회 접근 시도
http://target_ip/DVWA/vulnerabilities/fi/?page=../../hackable/uploads/dog.png
- 이 요청은 서버가 dog.png를 포함시키도록 시도함.
- 실제로는 PHP가 아닌 경우 실행되지 않지만, .php , .phtml 일 경우에는 자동 실행되어 매우 위험하다.
7. 업로드 후 접근 및 실행
업로드된 파일은 다음 경로에서 직접 접근이 가능하다
http://target_ip/DVWA/hackable/uploads/hello.php
=> 공격자가 PHP 코드를 심어두었다면, 브라우저로 접근 시 바로 실행되어 명령 실행, 파일 다운로드, 리버스 쉘 연결 등이 가능해진다.
그러면 이번에는 악성코드가 담긴 php 파일을 업로드 하고 이를 통해 리버스 쉘 연결을 해보자!
1) hello.php 악성코드가 담긴 php 파일을 준비한다.
2) 악성코드가 담긴 hello.php 파일을 업로드 한다.
3) 공격자는 피해자가 접근하기를 포트를 열고 기다린다.
4) 피해자는 File Inclusion으로 hello.php에 접근한다.
5) 공격자는 세션 획득에 성공한다.
6) 결국 공격자는 피해자 시스템 장악에 성공한다.
8. 업로드 실패 시 문제 해결
Apache 또는 DVWA 설정 변경 후 파일이 반영되지 않는 경우 다음 명령어로 웹 서버 재시작이 필요할 수 있다.
systemctl restart apache2
# 또는
service apache2 restart
9. 배운 점 & 느낀 점
- 파일 업로드 기능은 기능적으로는 단순하지만, 보안적으로는 매우 위험한 기능임을 다시 한번 느낄 수 있었다.
- 파일 확장자 제한이 없고 저장 경로가 공개되어 있다면 공격자는 이를 통해 서버 내부 제어까지 가능하다.
- 단순히 .php 업로드만 차단하는 것이 아니라, 서버 측에서 실행되지 않는 디렉터리로 분리 저장, 실제 콘텐츠 분석, 서버 실행 권한 제거 등 다양한 방어가 필요하다는 것을 느낄 수 있었다.
- 또한 File Inclusion 공격과의 연계로 파일 업로드 + 파일 포함 취약점이 동시에 존재하면 매우 강력한 조합이 된다는 것을 깨달았다.
10. 대응 방안
보안 조치 | 설명 |
확장자 필터링 | .php , .phtml , .asp , .exe 등 스크립트 차단 |
MIME 타입 필터링 | image/jpeg , image/png 등만 허용 |
이미지 사이즈 및 헤더 검증 | getimagesize() 또는 finfo_file() 등으로 확인 |
실행 디렉터리 분리 | /uploads/ 디렉터리는 PHP 실행 불가하도록 설정 |
업로드된 파일명 무작위화 | hash.ext , uuid.ext 등으로 이름 치환 저장 |
WAF 또는 백신 도입 | 웹 방화벽을 통한 우회 공격 탐지 대응 |
이 블로그는 불법 해킹 및 악의적인 활동을 지양하며, 그런 행위는 절대 권장하지 않습니다.
모든 실습은 허가된 환경에서만 진행해야 하며, 법적 책임은 사용자 본인에게 있습니다.
'웹 해킹 & 보안' 카테고리의 다른 글
[웹 모의해킹] File Upload - 파일 업로드 취약점 실습 - 2편 (0) | 2025.06.03 |
---|---|
[웹 모의해킹] File Inclusion - 파일 포함 취약점 실습 - 2편 (0) | 2025.06.03 |
[웹 모의해킹] File Inclusion - 파일 포함 취약점 실습 - 1편 (0) | 2025.06.02 |
[웹 모의해킹] CSRF -3편 - 보안 레벨 Medium, High 자동화 공격 스크립트 및 방어 코드 분석 (4) | 2025.06.01 |
[웹 모의해킹] CSRF - 2편 - 사이트 간 요청 위조 취약점 실습(환경 구성 + 공격 시나리오 + 에러 해결) (2) | 2025.06.01 |