FI는 URL에서 파일을 GET 할 수 있는 전제에 공격자가 악성 서버 스크립트를 서버에 전달하여 해당 페이지를 통해 악성 코드가 실행 되도록 하는 취약점이다.
그 파일의 경로에 따라서 LFI(Local File Inclusion),RFI(Remote File Inclusion) 으로 나뉘게 된다.
우리는 나의 서버의 있는 flags디렉토리에 fi.php 를 악성 스크립트로 생각하고 LFI를 진행할 것이다.
그 전에 Remote File Inclusion에 대해서 간단히 알아보면 ../../flag.txt 처럼 로컬에 있는 파일을 찾는 LFI와는 달리 RFI는 http프로토콜로 외부 서버에서 파일을 응답 받아 가져온다.
FI가 발동되는 조건은 보통 php에서 Include 함수를 사용할 때 적절한 필터링 없이 사용하게 되면 발동되게 된다.
파일을 소스보기로 볼 수 없는 내용들 또한 PHP wrapper의 php filter로 그 내용을 볼 수 있다.
PHP filter는 파일의 소스를 인코딩하여 우리에게 보여준다.
그럼 문제를 보자
아래는 index 페이지고 선택지는 file1.php , file2.php , file3.php가 있다.
각각 눌러보면 그 파일들이 Include되어 나온다.
include 되는 과정을 코드로 보며 알아보자
먼저 low.php에서 GET으로 file들을 가져온다.
그리고 index.php에서 low.php를 include한다.
<?php
// The page we wish to display
$file = $_GET[ 'page' ];
?>
<?php
define( 'DVWA_WEB_PAGE_TO_ROOT', '../../' );
require_once DVWA_WEB_PAGE_TO_ROOT . 'dvwa/includes/dvwaPage.inc.php';
dvwaPageStartup( array( 'authenticated', 'phpids' ) );
$page = dvwaPageNewGrab();
$page[ 'title' ] = 'Vulnerability: File Inclusion' . $page[ 'title_separator' ].$page[ 'title' ];
$page[ 'page_id' ] = 'fi';
$page[ 'help_button' ] = 'fi';
$page[ 'source_button' ] = 'fi';
dvwaDatabaseConnect();
$vulnerabilityFile = '';
switch( $_COOKIE[ 'security' ] ) {
case 'low':
$vulnerabilityFile = 'low.php';
break;
case 'medium':
$vulnerabilityFile = 'medium.php';
break;
case 'high':
$vulnerabilityFile = 'high.php';
break;
default:
$vulnerabilityFile = 'impossible.php';
break;
}
require_once DVWA_WEB_PAGE_TO_ROOT . "vulnerabilities/fi/source/{$vulnerabilityFile}";
// if( count( $_GET ) )
if( isset( $file ) )
include( $file );
else {
header( 'Location:?page=include.php' );
exit;
}
dvwaHtmlEcho( $page );
?>
여기서 중요한 것은 include하는 파일과 include 할 때에 어떤 필터링도 없다는 것이다.
그렇다는 점에서 FI에 매우 취약하다는 것을 알 수 있다.
우리는 DVWA에서 FI를 위해 숨겨놓은 flag파일을 악성코드라고 생각하고 include 하기로 했다.
그 경로를 param에 담아주자
그렇게 되면 fi.php의 파일이 include 되면서 우리가 찾아야하는 글 들이 나온다.
알아보기로는 총 5개의 라인을 찾아야 하는데 기본적으로는 3가지만 보여준다.
아마도 HIDDEN LINE과 5번 라인은 php코드에서만 볼 수 있을 것이다.
하지만 필터링이 되어 있지 않다는 취약점을 이용해서 우리는 php filter를 사용할 것이다.
아래는 "나의 ip/dvwa/vulnerabilities/fi/?page=php://filter/convert.base64-encode/resource=../../hackable/flags/fi.php"
를 url로 입력하였을 때 결과이다.
include 한 파일의 코드를 인코딩하여 보여준다.
이제 이 인코딩한 내용들을 다시 디코딩 해서 그 파일의 내용을 본다.
3번은 변수 초기화가 되어서 그 전 내용들이 보이지 않았던 것이고 5번은 아예 주석처리가 되어있었다.
이런식으로 필터링을 해놓지 않고 include 하게 된다면 서버 내 파일들의 내용을 탈취당할 수 있다.
이것들이 만약 Password 파일들이었으면 굉장히 위엄한 상황인 것이고 악성 코드라면 그 파일이 적절하게 include 되면서 홈페이지 큰 악영향을 줄 수 있다.